Zernio
APIFor you
Zernio
APIFor you
IntroductionQuickstartBuild a PlatformSDKsCLIMCPWebhooksWorkflowsSupport AssistantGuidesSecurityGlossaryPricingBillingChangelogRefer & earn
Dashboard
OverviewPlatformsAPI ReferenceResources
ChangelogWeekly updates

Subtitles, message requests and Google Ads

Captions on videos, Facebook and Instagram message requests, safer connects, sample webhooks and a big Google Ads release. Seven changes need a look.


A busy week, with 56 changes. Seven can affect an existing integration, so start with the box below.

In short:

  • Videos can carry captions in several languages.
  • Messages from strangers on Facebook and Instagram no longer go missing.
  • Connect can refuse the wrong account before it's saved.
  • Google Ads gained shared budgets, impression share bidding and image assets.

Check these if you use them: timeline follows can be null; Page lists add instagramAccount; Google Ads DELETEs and conversion actions changed; deleting a Meta ad can remove empty parents; ads reconnects can answer 409; iMessage orders can await payment.

Captions on your videos

Most social video is watched on mute, so captions decide whether people get the message. Attach up to 20 caption files (SRT or WebVTT) to a video, one per language, and Zernio converts them for each platform:

JSON
{
  "mediaItems": [
    {
      "type": "video",
      "url": "https://cdn.example.com/launch.mp4",
      "subtitles": [
        { "url": "https://cdn.example.com/launch.en.vtt", "language": "en" },
        { "url": "https://cdn.example.com/launch.es.srt", "language": "es" }
      ]
    }
  ]
}

Files must be public links under 1 MB. A platform that can't take a track skips it with a warning; a broken file answers 400 INVALID_SUBTITLES.

Learn more: Create a post · Media uploads

Message requests stop going missing

When someone who doesn't follow the account sends a message, Facebook and Instagram put it in a separate requests folder. Until now your users never saw those, and they're often new customers. List them, then accept one by replying:

Terminal
curl "https://zernio.com/api/v1/inbox/conversations?folder=requests" \
  -H "Authorization: Bearer $ZERNIO_API_KEY"

curl -X POST "https://zernio.com/api/v1/inbox/conversations/CONVERSATION_ID/accept" \
  -H "Authorization: Bearer $ZERNIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "accountId": "ACCOUNT_ID", "message": "Thanks for reaching out!" }'

The same release added the Messenger greeting and suggested questions, WhatsApp prompts and commands, and starting a workflow from your own code.

Learn more: Instagram inbox · Facebook inbox · Accept a request · Trigger a workflow

Connect the right account, not any account

A common support case: a user meant to connect their brand's Instagram but was logged into their personal one. Now you can say which account you expect. If they log in with another, nothing is saved and the flow returns error=account_mismatch, so you can ask them to switch:

Terminal
curl "https://zernio.com/api/v1/connect/instagram?profileId=PROFILE_ID&expectedUsername=acmedental" \
  -H "Authorization: Bearer $ZERNIO_API_KEY"

Handles can change, so prefer expectedPlatformUserId when you have it. Every account now exposes that id as platformUserId.

Learn more: Connecting accounts

Test a webhook without waiting for it

Some events, like an account disconnecting, are rare enough that your handler may never have run before it matters. Send yourself a sample, with the real headers and signature:

Terminal
curl -X POST "https://zernio.com/api/v1/webhooks/test" \
  -H "Authorization: Bearer $ZERNIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "webhookId": "WEBHOOK_ID", "event": "account.disconnected" }'

Samples carry test: true and placeholder ids, never your data.

Learn more: Send a test webhook · Webhooks

Google Ads: one budget, many campaigns

If your users split spend across campaigns, they no longer have to guess each campaign's share. Several campaigns can now draw from one daily budget, and Google moves money to whichever performs:

Terminal
curl -X POST "https://zernio.com/api/v1/ads/shared-budgets" \
  -H "Authorization: Bearer $ZERNIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "accountId": "ACCOUNT_ID", "name": "Q4 search", "amount": 150 }'

Then PUT /v1/ads/campaigns/{campaignId} with the returned sharedBudgetId and allowSharedBudgetUpdate: true. Also new: Target Impression Share bidding (aim to show on a set share of searches), excluded locations, image assets, and each ad's review status.

Learn more: Manage Google Ads · Create a shared budget

Also this week

  • Meta ads: carousel ads that open a chat (2 to 10 cards), live reads of campaigns and ad sets, video uploads that report when they're ready, and a clear 429 with Retry-After when Meta throttles.
  • TikTok ads: live account reads, duplicate ad groups, target by interest keywords and hashtags, and how long people watched.
  • Other ads: boost posts on X, browse Meta targeting categories, and LinkedIn ads created paused start as drafts.
  • Instagram: when followers are online, hour by hour, look up any business account, and see where comments on ads came from.
  • Analytics: error codes you can act on, sync status in account health, and a flag for Facebook posts you can't read.
  • More: Whop Pixel tracking, Reddit post comments, call ring timeout, and the connect token moved out of the URL.

Want every detail? See every change, day by day.

Was this page helpful?

Route every event to your tenant

External ids on profiles, tenant routing in webhooks, a branded connect screen, deleting inbox conversations and Meta ad review status.

Refer & earn

Earn 20% recurring commission for 12 months when you refer new customers to Zernio.

On this page

Captions on your videosMessage requests stop going missingConnect the right account, not any accountTest a webhook without waiting for itGoogle Ads: one budget, many campaignsAlso this week