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
GET
This lets you preview a video before selecting it (useful when multiple videos share the same first frame).
Key field:
•
View documentation
/v1/ads/videos now returns a playable video URL via source in the default response.This lets you preview a video before selecting it (useful when multiple videos share the same first frame).
Key field:
•
data[].source — signed CDN MP4 URL (expires; use for preview only and re-list to refresh)View documentation
GET /v1/ads/tree now supports scoping the tree to multiple ad accounts via adAccountId.You can pass a comma-separated list to limit results to a subset of connected accounts (useful for agency profiles).
Use
adAccountId=act_1,act_2,act_3 (max 50 per request). Single values keep the old behavior.Note: the plural aliases
adAccountIds and platformAdAccountIds are now rejected with 400 (to avoid silently returning unfiltered results).View documentation
Inbox list endpoints now return which connected accounts were skipped during aggregation via
This helps you distinguish between accounts that failed (
New response field:
•
Applies to:
•
•
•
View documentation
meta.accountsSkipped.This helps you distinguish between accounts that failed (
meta.failedAccounts) vs accounts that were intentionally not queried because the platform/account doesn’t support the feature or isn’t enabled.New response field:
•
meta.accountsSkipped: array of { accountId, platform }Applies to:
•
GET /v1/inbox/conversations•
GET /v1/inbox/comments•
GET /v1/inbox/reviewsView documentation
Meta ads now support the Page Likes objective via
This lets you create campaigns/ads optimized for Page Likes (Meta maps this to Engagement/Page Likes) using the same create flows.
Use
•
•
Notes for
View documentation
goal = page_likes.This lets you create campaigns/ads optimized for Page Likes (Meta maps this to Engagement/Page Likes) using the same create flows.
Use
goal with:•
POST /v1/ads/campaigns: goal now includes page_likes•
POST /v1/ads/create: goal now includes page_likesNotes for
page_likes (Meta): promotedObject.pageId is optional (auto-filled from the connected Page). Creative fields like headline, body, linkUrl, callToAction, imageUrl/video are optional (Meta derives the Like button + destination from the Page).View documentation
❤1
Google Search ads created via
You can create and attach sitelink assets during ad creation (Google reviews them asynchronously; approval is not immediate).
Use
• 2–20 items
• each item:
• optional:
Applies when
View documentation
POST /v1/ads/create now support campaign-level sitelinks.You can create and attach sitelink assets during ad creation (Google reviews them asynchronously; approval is not immediate).
Use
sitelinks (Google Search only):• 2–20 items
• each item:
text (max 25) + linkUrl (URI)• optional:
description1, description2 (each max 35)Applies when
campaignType is search.View documentation
Pinterest posts now support targeting a board section and optionally disclosing AI-modified content via
Use
Set
View documentation
PinterestPlatformData.Use
boardSectionId to publish into a specific section within boardId (omit it to post to the board). Pinterest rejects the pin if the section doesn’t belong to the board, so send both together.Set
isAiGenerated to true to include Pinterest’s AI_MODIFIED disclosure (shows an “AI modified” label); false (default) omits the disclosure.View documentation
Threads posts now support an optional first comment via
This lets you automatically publish a reply immediately after the main post is published; when using
Key field:
•
Note: the first comment is a Threads post and counts toward the profile’s 250 posts / 24h limit.
View documentation
platformSpecificData.threads.firstComment.This lets you automatically publish a reply immediately after the main post is published; when using
threadItems, it replies to the root post.Key field:
•
firstComment (string, max 500)Note: the first comment is a Threads post and counts toward the profile’s 250 posts / 24h limit.
View documentation
Instagram now supports publishing videos muted via
When
Use:
•
Applies to Reels, Stories, and video carousel slides; ignored for images. Videos above 200MB cannot be muted (mute before uploading).
View documentation
muteAudio in platformSpecificData.When
muteAudio=true, we strip the audio track before sending the video to Instagram, so the published video is permanently silent.Use:
•
muteAudio (boolean, default false)Applies to Reels, Stories, and video carousel slides; ignored for images. Videos above 200MB cannot be muted (mute before uploading).
View documentation
You can now fetch a single Google Business Profile review by ID via
This returns one review in the same shape as the items from
Key params:
•
•
•
Response includes
View documentation
GET /v1/accounts/{accountId}/gmb-reviews/{reviewId}.This returns one review in the same shape as the items from
GET /v1/accounts/{accountId}/gmb-reviews, which is useful for checking the latest state before replying (replies are overwritten in place).Key params:
•
accountId (path)•
reviewId (path, ID portion only)•
locationId (query, optional override; otherwise uses the account’s selected location)Response includes
review (GoogleBusinessReview).View documentation
GET
This lets you track recent workspace sign-ins (stamped at most once per hour). The field may be omitted for users with no recorded sign-in since it was introduced.
New field:
•
The
Updated enum:
•
New optional fields:
•
•
View documentation
/v1/users now returns lastLoginAt for each user.This lets you track recent workspace sign-ins (stamped at most once per hour). The field may be omitted for users with no recorded sign-in since it was introduced.
New field:
•
users[].lastLoginAtThe
message.sent webhook payload now supports more platforms and can include send context in a new metadata object.Updated enum:
•
message.platform: instagram, facebook, telegram, whatsapp, twitter, reddit, bluesky, slackNew optional fields:
•
metadata.quotedMessageId•
metadata.threadTs (Slack only)View documentation
GET
This lets you request a desired locale (e.g.
New:
• Query param:
• Response field:
View documentation
/v1/whatsapp/template-library now supports selecting a specific language variant via an optional language query param.This lets you request a desired locale (e.g.
es, en_US); if it’s not available, the API returns the first available variant and reports the actual variant in template.language.New:
• Query param:
language• Response field:
template.availableLanguages (array of supported language codes)View documentation