In
This lets you distinguish a real downloadable media file from a thumbnail/cover-image fallback.
Check:
•
•
•
View documentation
post.external.* webhooks, ExternalPostMediaItem now clarifies LinkedIn video behavior: when LinkedIn returns no video file, url falls back to the cover image and the item includes mediaStatus.This lets you distinguish a real downloadable media file from a thumbnail/cover-image fallback.
Check:
•
url (may be null, or for LinkedIn videos may be a cover image)•
mediaStatus: unavailable (present only when the media file could not be retrieved)•
unavailableReason: platform_withheldView documentation
mediaStatus on external/synced post media items can now be explicitly returned as available.This makes media availability explicit instead of relying only on the field being absent, while keeping backward compatibility (older synced items may still omit
mediaStatus).Updated enums:
•
ExternalPostMediaItem.mediaStatus: available | unavailable•
AnalyticsSinglePostResponse.mediaItems[].mediaStatus: available | unavailableNotes:
unavailable indicates the media file couldn’t be retrieved (often url is null, or LinkedIn video may return a cover image), and unavailableReason may be platform_withheld.View documentation
WhatsApp connect endpoints now return a clearer
This lets you distinguish between “number pinned to another profile” vs “number already connected elsewhere” and handle the conflict programmatically.
On
•
•
View documentation
409 conflict when the selected number is already connected on another profile/workspace.This lets you distinguish between “number pinned to another profile” vs “number already connected elsewhere” and handle the conflict programmatically.
On
POST /v1/connect/whatsapp/credentials and POST /v1/connect/whatsapp/select-phone-number, 409 may include:•
WHATSAPP_NUMBER_PINNED_TO_PROFILE — move it first with PATCH /v1/whatsapp/phone-numbers/{id}/profile•
WHATSAPP_NUMBER_ALREADY_CONNECTED — disconnect it from the other profile/workspace first (a number can only be live on one profile)View documentation
🔥2
New endpoint:
You can now poll a WhatsApp account’s Meta-originated event history (newest first), including template review outcomes and WABA status changes. This complements webhook push events with a queryable feed.
Required query:
Optional query:
Response:
View documentation
GET /v1/whatsapp/account-events.You can now poll a WhatsApp account’s Meta-originated event history (newest first), including template review outcomes and WABA status changes. This complements webhook push events with a queryable feed.
Required query:
accountIdOptional query:
limit (1–200, default 50)Response:
events[] with id, type (e.g. template_approved, template_rejected, account_restricted, account_disconnected), severity (info/success/warning/critical), title, detail, createdAt.View documentation
Phone number listings now include WhatsApp Business Calling status via
This lets you detect whether Calling is enabled per number when listing purchased numbers and connected (bring-your-own) numbers.
New fields:
•
-
-
•
-
-
View documentation
callingEnabled.This lets you detect whether Calling is enabled per number when listing purchased numbers and connected (bring-your-own) numbers.
New fields:
•
GET /v1/phone-numbers-
numbers[].callingEnabled-
connected[].callingEnabled•
GET /v1/whatsapp/phone-numbers (deprecated alias)-
numbers[].callingEnabled-
connected[].callingEnabledView documentation
External Instagram posts and analytics responses now include additional Instagram-specific metadata fields.
This helps you distinguish content types like Reels vs Feed, detect AI-generated labels, and see whether a Reel was shared to the main feed.
New optional fields:
•
•
•
•
Also,
View documentation
This helps you distinguish content types like Reels vs Feed, detect AI-generated labels, and see whether a Reel was shared to the main feed.
New optional fields:
•
mediaProductType (Instagram only; e.g. FEED, REELS, STORY, AD)•
isAiGenerated (Instagram only)•
isSharedToFeed (Instagram Reels only)•
mediaAudioType (Instagram only; MUSIC or ORIGINAL_SOUND)Also,
GET /v1/whatsapp/account-events events now include accountId in each event item.View documentation
🔥1
POST /v1/posts/{postId}/edit now supports editing published posts on more platforms and can target a specific account’s copy of a post.You can now edit on
platform: twitter, discord, facebook, reddit, linkedin, telegram, pinterest, googlebusiness, youtube, slack.When a post was published to multiple accounts on the same platform, pass
accountId to choose which one to edit (defaults to the first).Request body:
platform, content, optional accountId.View documentation
POST
This improves client-side handling when creating a Reddit DM thread fails (missing user, DM not allowed, or rate limiting).
Key response changes:
•
•
•
View documentation
/v1/inbox/conversations now returns more specific Reddit error details.This improves client-side handling when creating a Reddit DM thread fails (missing user, DM not allowed, or rate limiting).
Key response changes:
•
404 now includes code: PARTICIPANT_NOT_FOUND when the u/username doesn’t exist•
422 now also applies to Reddit when the recipient doesn’t accept private messages (still code: DM_NOT_ALLOWED)•
429 may now be returned for Reddit rate limits with code: rate_limitedView documentation
❤1
New endpoint GET /v1/ads/videos is available.
It lists a Meta ad account’s existing ad video library so you can reuse an already-uploaded video when creating ads (avoid duplicate uploads and share one upload across multiple ads).
Call with:
•
•
•
•
•
Use returned
Note: this endpoint is Meta-only; other platforms return
View documentation
It lists a Meta ad account’s existing ad video library so you can reuse an already-uploaded video when creating ads (avoid duplicate uploads and share one upload across multiple ads).
Call with:
•
accountId (required)•
adAccountId (required, act_<n>)•
fields (optional Graph field override)•
limit (optional, default 25, max 100)•
after (optional cursor)Use returned
data[].id as video.id on POST /v1/ads/create. A video is only usable once status.video_status is ready.Note: this endpoint is Meta-only; other platforms return
501.View documentation
❤2
LinkedIn company_list audiences can now be updated after creation via
This uploads a new full company list and replaces the existing list (not appended/merged). Matching is asynchronous and the audience stays
Send:
•
•
Notes:
•
•
View documentation
POST /v1/ads/audiences/{audienceId}/companies.This uploads a new full company list and replaces the existing list (not appended/merged). Matching is asynchronous and the audience stays
processing while LinkedIn processes the update.Send:
•
audienceId (path)•
companies (array, 1..300000) — each row must include at least one of name, domain, website, linkedinPageUrlNotes:
•
company_list is filled at creation from companies on POST /v1/ads/audiences; use the new endpoint for later changes•
POST /v1/ads/audiences/{audienceId}/users is customer_list-only and returns 422 for company_list (use /companies instead)View documentation
SIP trunking is now available for Voice: you can create SIP trunks and attach Zernio numbers to route inbound/outbound calls through an external SIP platform.
New endpoints:
•
•
•
•
•
•
•
Create trunk request fields:
Phone number responses now include
Behavior change: when a number is attached to a trunk, these endpoints can return
•
•
•
View documentation
New endpoints:
•
GET /v1/phone-numbers/sip-trunks (returns trunks, plus enabled)•
POST /v1/phone-numbers/sip-trunks (create; returns digestPassword only once)•
GET /v1/phone-numbers/sip-trunks/{id}•
DELETE /v1/phone-numbers/sip-trunks/{id}•
POST /v1/phone-numbers/sip-trunks/{id}/rotate-credentials (returns new digestPassword only once)•
POST /v1/phone-numbers/{id}/sip-trunk (attach with trunkId)•
DELETE /v1/phone-numbers/{id}/sip-trunk (detach)Create trunk request fields:
label, sipHost, optional sipPort, transport (tls/tcp/udp).Phone number responses now include
sipTrunkId (null when not trunked) on GET /v1/phone-numbers and GET /v1/phone-numbers/{id} (and the deprecated WhatsApp aliases).Behavior change: when a number is attached to a trunk, these endpoints can return
409 (invalid_resource_state) and require detaching first:•
DELETE /v1/phone-numbers/{id}•
POST /v1/phone-numbers/{id}/voice•
POST /v1/phone-numbers/{id}/whatsapp/callingView documentation
LinkedIn reshare behavior is now explicitly defined for
When you set
Note: a text-free reshare is not LinkedIn’s one-click “Repost” feed treatment (LinkedIn’s API doesn’t support creating that), so it will still appear authored by you.
Use:
View documentation
platformSpecificData.reshareUrl on POST /v1/posts.When you set
reshareUrl, the published post is always a reshare authored by your account with the original embedded underneath: with content it’s a quote-style reshare, and with no content it’s a text-free reshare.Note: a text-free reshare is not LinkedIn’s one-click “Repost” feed treatment (LinkedIn’s API doesn’t support creating that), so it will still appear authored by you.
Use:
platformSpecificData.reshareUrl (mutually exclusive with media).View documentation
WhatsApp Flows now let you set a data exchange endpoint via
This enables configuring the HTTPS callback endpoint directly on DRAFT flows (and it will be used only if your uploaded Flow JSON declares
New field:
•
•
Notes:
•
• Settable only while the flow is in
View documentation
endpointUri when creating or updating a flow.This enables configuring the HTTPS callback endpoint directly on DRAFT flows (and it will be used only if your uploaded Flow JSON declares
data_api_version "3.0").New field:
•
POST /v1/whatsapp/flows: endpointUri•
PATCH /v1/whatsapp/flows/{flowId}: endpointUriNotes:
•
endpointUri is uri format and HTTPS-only• Settable only while the flow is in
DRAFTView documentation
Connecting WhatsApp via
Response updates:
•
•
•
View documentation
POST /v1/connect/whatsapp/credentials now explicitly subscribes your Meta app to the WABA with a Zernio override callback, cutting over webhook delivery immediately (no overlap). Unsubscribing the app from the WABA afterward will also stop Zernio delivery and requires calling this endpoint again.Response updates:
•
webhookNotice may be returned on success with cutover/unsubscribe guidance•
account.phoneNumber replaces account.selectedPhoneNumber•
account.verifiedName and account.qualityRating are now included when availableView documentation
CTWA ad creation request (
You can now pass
Video fields:
•
•
New status controls:
•
•
View documentation
CtwaAdRequestBody) now supports reusing existing videos and more control over activation.You can now pass
video.id to reuse a video already uploaded to the ad account (instead of uploading via video.url). video.thumbnailUrl is now optional (Meta may auto-pick a thumbnail).Video fields:
•
video.url or video.id (either; id wins)•
video.thumbnailUrl (optional)New status controls:
•
status: ACTIVE | PAUSED (ad-level; default ACTIVE)•
campaignStatus: ACTIVE | PAUSED (campaign-level; default ACTIVE; rejected when using adSetId)View documentation
Meta ad videos can now be managed directly via the API: upload standalone videos and delete them from an ad account’s video library.
Use
Upload params:
•
• Exactly one of
• Optional
Returns
Use
Breaking change (CTWA): when using multi-creative
Also added for sorting:
View documentation
Use
POST /v1/ads/videos to upload before an ad exists (for reuse in POST /v1/ads/create via video.id or in POST /v1/ads/preview).Upload params:
•
accountId, adAccountId• Exactly one of
videoUrl (https) or videoBase64• Optional
filename (only for videoBase64)Returns
video.id and optional video.thumbnailUrl.Use
DELETE /v1/ads/videos/{videoId} with accountId + adAccountId to remove a video; returns { success: true } on success.Breaking change (CTWA): when using multi-creative
creatives[], setting any top-level headline/body/imageUrl/video now returns 400 (previously those fields could be silently ignored).Also added for sorting:
createdTime on AdTreeCampaign and AdTreeAdSet (proxy based on earliest ad creation time).View documentation
Meta ads now support standalone ad video upload and ad video delete.
You can upload a video before an ad exists, then reuse the returned
New endpoints:
•
•
Related changes:
•
• CTWA multi-creative requests (
•
View documentation
You can upload a video before an ad exists, then reuse the returned
video.id in POST /v1/ads/create (via video.id) or in POST /v1/ads/preview creative specs.New endpoints:
•
POST /v1/ads/videos with accountId, adAccountId, and exactly one of videoUrl or videoBase64 (optional filename for base64 uploads). Returns video.id and video.thumbnailUrl.•
DELETE /v1/ads/videos/{videoId} with query accountId, adAccountId. Returns { success: true } on delete.Related changes:
•
GET /v1/ads/videos docs now reference uploading via POST /v1/ads/videos (in addition to inline video.url on POST /v1/ads/create).• CTWA multi-creative requests (
creatives[]) now explicitly reject setting top-level headline/body/imageUrl/video with a 400 (previously described as being ignored in POST /v1/ads/create).•
GET /v1/ads/tree campaign/ad set nodes now include createdTime (date-time) for sorting by earliest ad creation time.View documentation
GET /v1/inbox/comments and GET /v1/inbox/comments/{postId} responses are now cached for up to 10 minutes.This means comment counts/threads may lag new comments within that window; for real-time updates, use the
comment.received webhook instead of polling.Notes:
• Cache window:
up to 10 minutes• Recommended real-time mechanism:
comment.received• On
GET /v1/inbox/comments/{postId}, your own writes (create/reply/delete) refresh the cache immediately.View documentation
CTWA ad creation now supports a custom chat welcome message via
This lets you override Meta’s default greeting and prefilled user text when the WhatsApp chat opens, so ads can steer the first message toward what they promote.
Set
•
•
View documentation
welcomeMessage.This lets you override Meta’s default greeting and prefilled user text when the WhatsApp chat opens, so ads can steer the first message toward what they promote.
Set
welcomeMessage (single-creative) or creatives[].welcomeMessage (multi-creative) with:•
text•
prefillTextView documentation
New endpoint
Use it to fetch short-lived asset URLs on demand (don’t cache long-term; re-fetch before serving/downloading).
Key details:
• Path param:
• Response:
• Errors:
View documentation
GET /v1/ads/{adId}/media returns direct signed URLs for every image/video asset used by an ad’s live creative (normalized across single, carousel, Reels/Story, and dynamic creative).Use it to fetch short-lived asset URLs on demand (don’t cache long-term; re-fetch before serving/downloading).
Key details:
• Path param:
adId (Zernio 24-char hex or platform ad id)• Response:
platform (facebook | instagram), media[] items with type (image | video), url, and for videos: thumbnailUrl, videoId, length, index• Errors:
422 (no active Meta connection), 501 (only supported on Meta)View documentation
WhatsApp interactive messages now support native address capture via
This lets you prompt users with Meta’s structured shipping-address form in-chat; submissions arrive as
To send, set:
•
•
•
Webhook parsing update:
View documentation
interactive.type = address_message on POST /v1/inbox/conversations/{conversationId}/messages.This lets you prompt users with Meta’s structured shipping-address form in-chat; submissions arrive as
metadata.interactiveType = nfm_reply on the message.received webhook.To send, set:
•
interactive.type: address_message•
interactive.action.name: address_message•
interactive.action.parameters.country: ISO 3166-1 alpha-2 (required)Webhook parsing update:
WebhookPayloadMessage.metadata now includes nfmReplyName (e.g. flow vs address_message) to distinguish address submissions from Flow submissions; address fields are included in flowResponseData.View documentation