4 new Inbox APIs just shipped
1. Contacts
Auto-created from every DM across all your connected accounts. Add tags, custom fields, bulk import.
2. Broadcasts
Send one message to thousands of contacts. Segment by tag or custom field. Supports Instagram, Facebook, Telegram, WhatsApp, Twitter, Bluesky, Reddit. Schedule or send immediately. Real-time delivery + read tracking.
3. Sequences
Drip campaigns for social DMs. Set delays between steps (hours, days). Auto-exit on reply or unsubscribe.
4. Comment Automations
Set a keyword on any Instagram or Facebook post. When someone comments it, they get a DM instantly. Add an optional public reply too.
All official platform APIs. Requires the Inbox add-on.
https://docs.zernio.com/
1. Contacts
Auto-created from every DM across all your connected accounts. Add tags, custom fields, bulk import.
POST /v1/contacts · POST /v1/contacts/bulk · GET /v1/contacts · GET /v1/contacts/:id · PATCH /v1/contacts/:id · DELETE /v1/contacts/:id
2. Broadcasts
Send one message to thousands of contacts. Segment by tag or custom field. Supports Instagram, Facebook, Telegram, WhatsApp, Twitter, Bluesky, Reddit. Schedule or send immediately. Real-time delivery + read tracking.
POST /v1/broadcasts · POST /v1/broadcasts/:id/send · POST /v1/broadcasts/:id/schedule · POST /v1/broadcasts/:id/cancel · POST /v1/broadcasts/:id/recipients
3. Sequences
Drip campaigns for social DMs. Set delays between steps (hours, days). Auto-exit on reply or unsubscribe.
POST /v1/sequences · POST /v1/sequences/:id/activate · POST /v1/sequences/:id/pause · POST /v1/sequences/:id/enroll · GET /v1/sequences/:id/enrollments
4. Comment Automations
Set a keyword on any Instagram or Facebook post. When someone comments it, they get a DM instantly. Add an optional public reply too.
POST /v1/comment-automations · GET /v1/comment-automations/:id/logs
All official platform APIs. Requires the Inbox add-on.
https://docs.zernio.com/
❤3🔥3👎1👏1😁1
YouTube analytics now supports audience demographics via
Fetch demographic insights for a YouTube channel broken down by age/gender (percentages) and country (view counts). Requires the Analytics add-on and YouTube Analytics scope.
Key params:
•
•
•
WhatsApp now supports Flows (create/manage/publish and send interactive flow messages).
Manage flows:
•
•
•
•
•
Flow JSON asset:
•
•
Lifecycle:
•
•
Send a flow message:
•
• Optional
View documentation
GET /v1/analytics/youtube/demographics.Fetch demographic insights for a YouTube channel broken down by age/gender (percentages) and country (view counts). Requires the Analytics add-on and YouTube Analytics scope.
Key params:
•
accountId (required)•
breakdown = age, gender, country (comma-separated; defaults to all)•
startDate, endDateWhatsApp now supports Flows (create/manage/publish and send interactive flow messages).
Manage flows:
•
GET /v1/whatsapp/flows (accountId)•
POST /v1/whatsapp/flows (accountId, name, categories, optional cloneFlowId)•
GET /v1/whatsapp/flows/{flowId} (accountId, optional fields)•
PATCH /v1/whatsapp/flows/{flowId} (accountId, name/categories; DRAFT only)•
DELETE /v1/whatsapp/flows/{flowId} (accountId; DRAFT only)Flow JSON asset:
•
GET /v1/whatsapp/flows/{flowId}/json (accountId)•
PUT /v1/whatsapp/flows/{flowId}/json (accountId, flow_json; DRAFT only)Lifecycle:
•
POST /v1/whatsapp/flows/{flowId}/publish (accountId; irreversible)•
POST /v1/whatsapp/flows/{flowId}/deprecate (accountId; irreversible)Send a flow message:
•
POST /v1/whatsapp/flows/send with accountId, to, flow_id, flow_cta, body• Optional
flow_action = navigate | data_exchange, flow_token, flow_action_payload, draftView documentation
❤2👎1🔥1👏1
New Google Business Profile analytics endpoints are available.
Fetch daily performance metrics (impressions, clicks, calls, directions, etc.) via
Key params:
•
•
•
Fetch monthly search keywords via
Key params:
•
•
Note: keywords below Google’s minimum impression threshold are excluded.
View documentation
Fetch daily performance metrics (impressions, clicks, calls, directions, etc.) via
GET /v1/analytics/googlebusiness/performance. Requires accountId and the Analytics add-on; data may be delayed 2–3 days; up to 18 months history.Key params:
•
accountId (required)•
metrics (comma-separated; defaults to all): BUSINESS_IMPRESSIONS_DESKTOP_MAPS, BUSINESS_IMPRESSIONS_DESKTOP_SEARCH, BUSINESS_IMPRESSIONS_MOBILE_MAPS, BUSINESS_IMPRESSIONS_MOBILE_SEARCH, BUSINESS_CONVERSATIONS, BUSINESS_DIRECTION_REQUESTS, CALL_CLICKS, WEBSITE_CLICKS, BUSINESS_BOOKINGS, BUSINESS_FOOD_ORDERS, BUSINESS_FOOD_MENU_CLICKS•
startDate, endDate (YYYY-MM-DD)Fetch monthly search keywords via
GET /v1/analytics/googlebusiness/search-keywords. Requires accountId and the Analytics add-on; up to 18 months history.Key params:
•
accountId (required)•
startMonth, endMonth (YYYY-MM)Note: keywords below Google’s minimum impression threshold are excluded.
View documentation
🔥2❤1
You can now edit a published X (Twitter) post via
This updates the post on X and stores edit history in Zernio. X constraints apply (Premium required, 1-hour edit window, max 5 edits, text-only).
Request body:
•
•
Response includes:
•
•
You can now start/send X DMs via
If a thread already exists, the message is appended. If the recipient doesn’t accept DMs, you’ll get
Key fields:
•
•
•
•
Also added:
• Root-level
•
View documentation
POST /v1/posts/{postId}/edit.This updates the post on X and stores edit history in Zernio. X constraints apply (Premium required, 1-hour edit window, max 5 edits, text-only).
Request body:
•
platform: twitter•
content: new textResponse includes:
•
id (new tweet ID after edit)•
urlYou can now start/send X DMs via
POST /v1/inbox/conversations.If a thread already exists, the message is appended. If the recipient doesn’t accept DMs, you’ll get
422 with code=DM_NOT_ALLOWED (or bypass the pre-check with skipDmCheck).Key fields:
•
accountId•
participantId or participantUsername•
message (or attachment via multipart/form-data)•
skipDmCheckAlso added:
• Root-level
facebookSettings on POST /v1/posts and PUT /v1/posts/{postId} (e.g. facebookSettings.draft=true to create an unpublished draft in Facebook Publishing Tools)•
TwitterPlatformData.longVideo=true to enable long video uploads (requires X Premium; may require allowlisting).View documentation
❤2🔥2💯1
Facebook now supports posting an optional first comment for Reels as well as feed posts.
Use
Applies when
View documentation
Use
platformSpecificData.facebook.firstComment to add a comment immediately after publishing (not supported for contentType=story). Skipped when draft is true.Applies when
contentType is reel (or omitted for feed posts).View documentation
🔥3
We just released the official Zernio adapter for Vercel's Chat SDK
https://docs.zernio.com/resources/integrations/chat-sdk
https://docs.zernio.com/resources/integrations/chat-sdk
Zernio
Zernio Chat SDK Adapter - Build Multi-Platform Chatbots
Build chatbots that work across Instagram, Facebook, Telegram, WhatsApp, Twitter/X, Bluesky, and Reddit through a single Chat SDK adapter.
🔥5
Webhooks now support message sent events via
Use this to get notified when a message is sent via the API, including message + conversation context.
Subscribe by adding
You can also filter/view deliveries in logs with
Payload schema:
View documentation
message.sent.Use this to get notified when a message is sent via the API, including message + conversation context.
Subscribe by adding
message.sent to Webhook.events.You can also filter/view deliveries in logs with
GET /v1/webhooks/logs using event=message.sent.Payload schema:
WebhookPayloadMessageSent (includes message, conversation, account, timestamp).View documentation
❤2👍2👏1
Discord is now supported as a platform in several endpoints and response schemas.
You can now use
Updated enums:
•
•
•
• Schemas:
View documentation
You can now use
platform=discord to connect accounts, validate content, and filter account health.Updated enums:
•
GET /v1/connect/{platform}: {platform} includes discord•
POST /v1/tools/validate/post: platforms[].platform includes discord•
GET /v1/accounts/health: query platform includes discord• Schemas:
SocialAccount.platform, PostLog.platform, ConnectionLog.platform include discordView documentation
❤2
Meta ads now return additional campaign/ad set details in ad reporting responses.
You can use these fields to display objective/optimization/bidding context and conversion event setup alongside metrics.
New fields:
• On
• On
• On
View documentation
You can use these fields to display objective/optimization/bidding context and conversion event setup alongside metrics.
New fields:
• On
Ad: platformObjective, optimizationGoal, bidStrategy, promotedObject• On
AdTreeCampaign and AdCampaign: platformObjective, optimizationGoal (can be string or string[]), bidStrategy, promotedObject• On
AdTreeAdSet: optimizationGoal, bidStrategy, promotedObjectpromotedObject may include custom_event_type, pixel_id, page_id (and on Ad also application_id, product_set_id). Fields are null when not applicable and are only present for Meta ads.View documentation
❤3🔥2
Campaign-level
If ad sets have different optimization goals, the API now returns a comma-separated string instead of an array.
Applies to:
•
•
Example:
View documentation
optimizationGoal is now always a string in ads campaign responses.If ad sets have different optimization goals, the API now returns a comma-separated string instead of an array.
Applies to:
•
GET /v1/ads/campaigns (AdCampaign.optimizationGoal)•
GET /v1/ads/tree (AdTreeCampaign.optimizationGoal)Example:
"OFFSITE_CONVERSIONS, VALUE, LEAD_GENERATION"View documentation
❤2
New Ads Conversions API endpoints are available:
You can now relay conversion events to Meta or Google Ads; platform is inferred from
Use
Send events via
Response includes
View documentation
POST /v1/ads/conversions and GET /v1/accounts/{accountId}/conversion-destinations.You can now relay conversion events to Meta or Google Ads; platform is inferred from
accountId. List valid destinations first, then send a batch of events.Use
GET /v1/accounts/{accountId}/conversion-destinations to get destinations[].id (use as destinationId) and destinations[].status (active/inactive). For Google, destinations[].type is present (event type locked to the conversion action).Send events via
POST /v1/ads/conversions with accountId, destinationId, events[] (each requires eventName, eventTime, eventId, user). Optional: testCode (Meta only) and batch-level consent (adUserData/adPersonalization: GRANTED/DENIED, Google only).Response includes
platform (metaads/googleads), eventsReceived, eventsFailed, failures[], and traceId. Requires the Ads add-on.View documentation
🔥4👏1
Discord support has been added: you can now manage Discord account settings, list available guild channels, and post to Discord with Discord-specific options.
Manage Discord connection settings:
•
•
•
Post to Discord via
• Required:
• Optional:
Analytics responses now include
Ads goals have been expanded in
View documentation
Manage Discord connection settings:
•
GET /v1/accounts/{accountId}/discord-settings (read current channel/guild + webhook identity)•
PATCH /v1/accounts/{accountId}/discord-settings (update webhookUsername/webhookAvatarUrl and/or switch channelId)•
GET /v1/accounts/{accountId}/discord-channels (discover channels: type = 0/5/15)Post to Discord via
POST /v1/posts using platformSpecificData = DiscordPlatformData:• Required:
channelId• Optional:
embeds, poll, crosspost, forumThreadName, forumAppliedTags, threadFromMessage, tts, webhookUsername, webhookAvatarUrlAnalytics responses now include
platformPostId per platform in GET /v1/analytics.Ads goals have been expanded in
POST /v1/ads/boost and POST /v1/ads/create: goal now supports engagement, traffic, awareness, video_views, lead_generation, conversions, app_promotion (availability varies by platform).View documentation
❤2🔥2
Webhook comment.received payloads may now include
Handle missing internal IDs by relying on the platform IDs instead.
Fields that can now be
•
•
Use
View documentation
null for Zernio internal post IDs when the post was not published through Zernio.Handle missing internal IDs by relying on the platform IDs instead.
Fields that can now be
null:•
comment.postId•
post.idUse
comment.platformPostId / post.platformPostId as the stable identifiers in these cases.View documentation
❤1
Google Business Platform posts now support EVENT and OFFER types via
This lets you publish event and offer posts (in addition to standard updates) to Google Search/Maps/GBP.
Set
When
When
View documentation
topicType in GoogleBusinessPlatformData.This lets you publish event and offer posts (in addition to standard updates) to Google Search/Maps/GBP.
Set
topicType to: STANDARD | EVENT | OFFER (default: STANDARD)When
topicType is EVENT, include event (required): event.title, event.schedule.startDate, event.schedule.endDate (optional: startTime, endTime).When
topicType is OFFER, include offer (recommended): offer.offerType (OFFER | BUY_ONE_GET_ONE), offer.redeemOnlineUrl, offer.termsConditions, offer.couponCode.View documentation
❤2🔥1
New Google Business Profile (GBP) capabilities are available: manage Services, update Place Action links, and fetch Reviews across multiple locations in one call.
Manage location services:
•
•
Update a Place Action link:
•
•
Batch fetch reviews for multi-location accounts:
•
View documentation
Manage location services:
•
GET /v1/accounts/{accountId}/gmb-services (optional locationId)•
PUT /v1/accounts/{accountId}/gmb-services replaces the full list via serviceItems (structured or free-form, optional price)Update a Place Action link:
•
PATCH /v1/accounts/{accountId}/gmb-place-actions with name (required), and optionally uri and/or placeActionType•
placeActionType: APPOINTMENT, ONLINE_APPOINTMENT, DINING_RESERVATION, FOOD_ORDERING, FOOD_DELIVERY, FOOD_TAKEOUT, SHOP_ONLINEBatch fetch reviews for multi-location accounts:
•
POST /v1/accounts/{accountId}/gmb-reviews/batch with locationNames, optional pageSize (max 50) and pageTokenView documentation
❤1
Webhooks now support review events via
Sending inbox messages now supports WhatsApp rich interactive messages via
Set
Interactive taps/submissions are delivered in the
View documentation
events: review.new, review.updated (in POST /v1/webhooks/settings and PUT /v1/webhooks/settings).Sending inbox messages now supports WhatsApp rich interactive messages via
interactive in POST /v1/inbox/conversations/{conversationId}/messages.Set
interactive.type to: list, cta_url, or flow (WhatsApp only). When interactive is set, it takes priority over buttons and quickReplies.Interactive taps/submissions are delivered in the
message.received webhook under metadata: interactiveType (button_reply | list_reply | nfm_reply), interactiveId, flowResponseJson, flowResponseData.View documentation
🔥1
Reddit posting now supports native video submissions via new fields in
You can upload videos to Reddit’s CDN for an embedded player (with automatic fallback to a link post if video posts aren’t allowed), or submit silent looping clips.
New fields:
•
•
•
View documentation
RedditPlatformData.You can upload videos to Reddit’s CDN for an embedded player (with automatic fallback to a link post if video posts aren’t allowed), or submit silent looping clips.
New fields:
•
nativeVideo (boolean, default true) - use Reddit native video flow; set false to fall back to a legacy link post•
videogif (boolean) - submit as silent videogif when nativeVideo is active•
videoPosterUrl (uri) - optional thumbnail/poster image for native video postsView documentation
🔥1
PUT /v1/inbox/conversations/{conversationId} can now return 404.This happens when the conversation isn’t found on WhatsApp (other platforms upsert instead of returning not found).
Handle the new response:
404 Conversation not found.View documentation
🔥1
Meta ads now support Advantage Audience controls when creating/boosting ads and when updating Meta targeting.
This lets you explicitly enable/disable Meta’s targeting automation during ad set creation, and optionally preserve the current setting on updates.
Use:
•
•
•
View documentation
This lets you explicitly enable/disable Meta’s targeting automation during ad set creation, and optionally preserve the current setting on updates.
Use:
•
POST /v1/ads/boost: targeting.advantage_audience = 0 | 1•
PUT /v1/ads/{adId}: targeting.advantage_audience = 0 | 1 (omit to keep existing)•
POST /v1/ads/create: advantageAudience = 0 | 1View documentation
🔥2
Ad metrics now include conversion reporting and raw action breakdowns via new fields on
This lets you read conversion counts/cost directly and also extract any Meta action/conversion type from Insights without relying only on derived metrics.
New fields:
•
•
•
View documentation
AdMetrics.This lets you read conversion counts/cost directly and also extract any Meta action/conversion type from Insights without relying only on derived metrics.
New fields:
•
conversions (integer) — conversion events matching the campaign’s promoted event type (Meta-only for now; others return 0)•
costPerConversion (number) — spend / conversions (0 when conversions is 0)•
actions (object<string, integer>) — per action_type counts (e.g. link_click, offsite_conversion.fb_pixel_purchase)View documentation
❤4
New Ads API write endpoints are available for managing campaigns and ad sets (budget updates, pause/resume, duplication, deletion). This adds first-class support for CBO vs ABO budget routing and bulk status changes.
Campaign budget updates (CBO):
• Body:
• If the campaign is ABO, returns
Ad set updates (ABO budget and/or status):
• Body:
• If parent campaign is CBO and you try to update budget here, returns
Convenience ad set status toggle:
• Body:
Bulk pause/resume campaigns (up to 50):
• Body:
• Returns per-campaign results so one failure doesn’t fail the whole batch
Duplicate a campaign (Meta async copy + optional discovery):
• Key options:
Delete a campaign (cascades to ad sets/ads):
• Body:
Also added to campaign responses (
•
•
Meta-only for now where noted; other platforms may return
View documentation
Campaign budget updates (CBO):
PUT /v1/ads/campaigns/{campaignId}• Body:
platform (facebook|instagram), budget.amount, budget.type (daily|lifetime)• If the campaign is ABO, returns
409 (BUDGET_LEVEL_MISMATCH) — update the ad set insteadAd set updates (ABO budget and/or status):
PUT /v1/ads/ad-sets/{adSetId}• Body:
platform, optional budget, optional status (active|paused)• If parent campaign is CBO and you try to update budget here, returns
409 (BUDGET_LEVEL_MISMATCH)Convenience ad set status toggle:
PUT /v1/ads/ad-sets/{adSetId}/status• Body:
platform, status (active|paused)Bulk pause/resume campaigns (up to 50):
POST /v1/ads/campaigns/bulk-status• Body:
status (active|paused), campaigns[] with platformCampaignId + platform• Returns per-campaign results so one failure doesn’t fail the whole batch
Duplicate a campaign (Meta async copy + optional discovery):
POST /v1/ads/campaigns/{campaignId}/duplicate• Key options:
deepCopy (default true), statusOption (ACTIVE|PAUSED|INHERITED_FROM_SOURCE), syncAfter (default true)Delete a campaign (cascades to ad sets/ads):
DELETE /v1/ads/campaigns/{campaignId}• Body:
platform (facebook|instagram)Also added to campaign responses (
GET /v1/ads/campaigns and GET /v1/ads/tree):•
reviewStatus (in_review|approved|rejected|with_issues)•
budgetLevel (campaign|adset), campaignBudget, and currency to disambiguate CBO vs ABO budgetsMeta-only for now where noted; other platforms may return
501 for unsupported operations.View documentation
❤5🔥1