WhatsApp now supports managing your blocklist via
You can list blocked users, block up to 1,000 users per request, and unblock in batches (per-user failures are returned without failing the whole request).
New endpoints:
•
•
•
WhatsApp interactive messages now also support location requests in
View documentation
/v1/whatsapp/block-users.You can list blocked users, block up to 1,000 users per request, and unblock in batches (per-user failures are returned without failing the whole request).
New endpoints:
•
GET /v1/whatsapp/block-users with accountId, optional limit, after (cursor pagination via nextCursor)•
POST /v1/whatsapp/block-users body: accountId, users (1..1000)•
DELETE /v1/whatsapp/block-users body: accountId, users (1..1000)WhatsApp interactive messages now also support location requests in
POST /v1/inbox/conversations/{conversationId}/messages via interactive.type = location_request_message (and action can be omitted; defaults to {"name":"send_location"}).View documentation
❤1
POST
Use this to request consumer permission before placing a Business-Initiated Call; the consumer must tap Allow before
Set:
•
•
View documentation
/v1/whatsapp/calls now supports sending the WhatsApp call-consent prompt via a new optional action parameter.Use this to request consumer permission before placing a Business-Initiated Call; the consumer must tap Allow before
start_call is permitted (Meta rate-limits prompts and requires an open 24h service window).Set:
•
action: send_call_permission_request (omit action to place a call)•
bodyText: optional text shown with the consent prompt (max 1024 chars)View documentation
❤1
WhatsApp adds blocked-status lookup for a single contact via
This returns a definitive blocked state using Zernio’s blocklist mirror (kept in sync by block/unblock; first call per account may backfill from Meta’s full list).
Required query params:
•
•
Response
•
View documentation
GET /v1/whatsapp/block-users/status.This returns a definitive blocked state using Zernio’s blocklist mirror (kept in sync by block/unblock; first call per account may backfill from Meta’s full list).
Required query params:
•
accountId•
user (consumer wa_id or E.164 phone; leading + optional)Response
200:•
blocked (boolean)View documentation
❤1
GET
This lets you choose whether daily totals are attributed to the post’s publish date or bucketed by the day engagement was actually received (engagement-over-time).
Use
•
•
View documentation
/v1/analytics/daily-metrics now supports engagement attribution via a new query param attribution.This lets you choose whether daily totals are attributed to the post’s publish date or bucketed by the day engagement was actually received (engagement-over-time).
Use
attribution:•
publish (default) — attribute each post’s lifetime total to its publish date•
received — attribute per-day engagement increases to the day they occurredView documentation
❤1
YouTube analytics now supports video retention curves via
This returns an aggregated (not per-day) audience retention curve for a single video, plus
Call with:
•
•
• optional
Response highlights:
•
• empty
Requires
Also added to
• top-level
• per-day
View documentation
GET /v1/analytics/youtube/video-retention.This returns an aggregated (not per-day) audience retention curve for a single video, plus
durationSeconds so you can render the curve on a time axis.Call with:
•
videoId•
accountId• optional
startDate, endDateResponse highlights:
•
retentionCurve[] points with elapsedVideoTimeRatio, audienceWatchRatio (can be > 1), relativeRetentionPerformance• empty
retentionCurve for low-view / not-yet-processed videos (2–3 day delay)Requires
yt-analytics.readonly; if missing you may get 412 with code=youtube_analytics_scope_missing.Also added to
GET /v1/analytics/youtube/daily-views responses:• top-level
durationSeconds• per-day
averageViewPercentage (can exceed 100; don’t clamp client-side)View documentation
❤1
WhatsApp interactive messages now support voice call buttons when sending inbox messages via
This lets you render WhatsApp’s native “call” CTA in-chat (requires WhatsApp Business Calling enabled on the sending number). Optional attribution data can be echoed back on the
Use
•
•
•
Also,
View documentation
POST /v1/inbox/conversations/{conversationId}/messages.This lets you render WhatsApp’s native “call” CTA in-chat (requires WhatsApp Business Calling enabled on the sending number). Optional attribution data can be echoed back on the
calls webhook.Use
interactive.type = voice_call and interactive.action.name = voice_call. Optional interactive.action.parameters:•
display_text•
ttl_minutes•
payloadAlso,
GET /v1/whatsapp/calling now returns callDeepLink (nullable) for the public https://wa.me/call/<number> deep link when calling is enabled.View documentation
❤1
Google campaign objects now include
This exposes the raw Google Ads
New field:
•
View documentation
advertisingChannelType in AdCampaign and AdTreeCampaign.This exposes the raw Google Ads
campaign.advertising_channel_type so you can distinguish campaign serving surfaces (e.g. Search vs Performance Max) when syncing/reporting.New field:
•
advertisingChannelType (string, nullable) — Google-only (e.g. SEARCH, PERFORMANCE_MAX, VIDEO, DEMAND_GEN, DISPLAY, SHOPPING)View documentation
❤1
Broadcast recipient results now include a plain-language failure reason via
This helps you interpret WhatsApp
Use:
•
•
Webhooks for delivery status now also include
View documentation
errorExplanation on GET /v1/broadcasts/{broadcastId}/recipients.This helps you interpret WhatsApp
errorCode values (e.g. opt-out / re-engagement required) without maintaining your own mapping.Use:
•
recipients[].errorCode (integer, nullable)•
recipients[].errorExplanation (string, nullable; null if unmapped — fall back to error)Webhooks for delivery status now also include
error.explanation in WebhookPayloadMessageDeliveryStatus (populated on event=message.failed).View documentation
❤1
GET /v1/connect/{platform}/ads now supports ad sync scoping via adAccountId/adAccountIds across more ads platforms (not just Meta).You can limit discovery/sync to specific ad accounts for
facebook/instagram (Meta), linkedin, googleads, and twitter. Changing the scope will also remove already-synced ads from any de-scoped ad accounts.Use:
•
adAccountId - single ad account id (platform-specific format)•
adAccountIds - multiple ids (repeat param or comma-separated)Notes:
•
tiktok ignores these params (advertisers are scoped during OAuth)•
pinterest ignores these params (no ads discovery)• Meta ids (
act_<digits>) are validated against the connected token; unreachable ids return 400• Omitting both
adAccountId and adAccountIds keeps the previously persisted scope unchangedView documentation
GET
When
New field:
View documentation
/v1/whatsapp/phone-numbers/kyc now returns a human-readable summary when a reusable KYC verification is available.When
reusable.available is true, you can show what verification is already on file (best-effort; may be empty if provider lookup fails) and let users skip re-entering the form.New field:
reusable.details (array of { label, value }) alongside reusable.fromPhoneNumber.View documentation
❤1
WhatsApp regulated-number KYC reuse now supports choosing which prior approved verification to reuse.
When submitting with reuse,
View documentation
GET /v1/whatsapp/phone-numbers/kyc adds reusable.options (newest first), listing all approved verifications (each with fromPhoneNumber + details).When submitting with reuse,
POST /v1/whatsapp/phone-numbers/kyc adds reuseFrom to select the verification to reuse (set to reusable.options[].fromPhoneNumber). Omit reuseFrom to use the newest; no match returns 409.View documentation
❤1
POST /v1/accounts/{accountId}/conversion-destinations now supports creating conversion destinations for Google Ads in addition to LinkedIn.You can create a Google Ads conversion action (created as
UPLOAD_CLICKS for offline uploads). Standard event names are mapped automatically, and actions default to secondary unless you opt in.Key Google Ads fields:
•
countingType: MANY_PER_CLICK | ONE_PER_CLICK•
primaryForGoal: true | false (default false)Notes:
•
accountId can now be linkedinads or googleads• Creation is not idempotent — retries can create duplicates
• 201 response
platform now includes linkedinads | googleadsView documentation
❤1
Google Ads conversion destination creation via
If a conversion action with the same
Key fields:
•
•
New response:
•
View documentation
POST /v1/accounts/{accountId}/conversion-destinations is now effectively idempotent by name.If a conversion action with the same
name already exists, the API will reuse it and return the same response as a fresh create. If the same name is used with a different type (category), the API now returns 409 with error code IDEMPOTENCY_CONFLICT.Key fields:
•
name•
typeNew response:
•
409 (Google Ads only) — IDEMPOTENCY_CONFLICTView documentation
❤1
POST /v1/ads/conversions now supports TikTok conversions (platform tiktokads).You can now relay OFFLINE conversion events to TikTok via the Offline Events API. Use
destinationId as the TikTok Offline Event Set ID, and note each event must include an email or phone.Key details:
•
accountId now accepts: metaads, googleads, linkedinads, tiktokads• Response
platform enum now includes tiktokadsGET /v1/accounts/{accountId}/conversion-destinations also now supports tiktokads (platform enum includes tiktokads).GET /v1/ads/tree adds campaignId (platform campaign id) to restrict the tree to a single campaign, independent of pagination.View documentation
❤3
LinkedIn posts now support quote-reshare via
Set
Notes:
•
• Works on personal profiles and organization pages
Error responses are now more structured for programmatic handling:
View documentation
reshareUrl in LinkedInPlatformData.Set
reshareUrl to a LinkedIn post link ("Copy link to post") or a urn:li:share / urn:li:ugcPost / urn:li:groupPost URN. The published post becomes a repost with your content as commentary and the original post embedded underneath.Notes:
•
reshareUrl is mutually exclusive with media• Works on personal profiles and organization pages
Error responses are now more structured for programmatic handling:
ErrorResponse adds type, code, param, platform, and platformError (raw upstream payload when type is platform_error).type can be: invalid_request_error, authentication_error, permission_error, not_found, rate_limit_error, platform_error, api_error.View documentation
❤3
POST
This enables safer launches (no immediate spend) and easier multi-ad-set testing while keeping creatives consistent.
New request fields:
•
•
•
View documentation
/v1/ads/create now supports additional Meta-only creation options: you can create ads/ad sets paused, add a new ad set under an existing campaign, and/or reuse an existing creative.This enables safer launches (no immediate spend) and easier multi-ad-set testing while keeping creatives consistent.
New request fields:
•
status: ACTIVE | PAUSED•
existingCampaignId (Meta only; mutually exclusive with adSetId and creatives[])•
existingCreativeId (Meta only; mutually exclusive with creatives[], dynamicCreative, placementAssets)View documentation
❤1
POST
You can stage Meta campaigns/ads more safely (e.g., create everything paused, or pause just the campaign while keeping the ad set ready), and you can now attach new ads using an existing creative without resending copy/media.
New/updated fields:
•
•
•
View documentation
/v1/ads/create now supports more control over Meta publish state and creative reuse.You can stage Meta campaigns/ads more safely (e.g., create everything paused, or pause just the campaign while keeping the ad set ready), and you can now attach new ads using an existing creative without resending copy/media.
New/updated fields:
•
status (ACTIVE | PAUSED) now explicitly controls desired publish state; in attach mode (adSetId) it affects only the new ad•
campaignStatus (ACTIVE | PAUSED) lets you set campaign state independently on the legacy create shape (ignored when existingCampaignId is set)•
existingCreativeId can now be used with adSetId to attach an ad that reuses an existing Meta creative (copy/media fields can be omitted)View documentation
❤1
Meta ads created via
This lets you clone an ad set’s full Meta-native targeting spec via
When both are set,
Key fields:
•
•
•
View documentation
POST /v1/ads/create now allow combining manual placements with rawTargeting.This lets you clone an ad set’s full Meta-native targeting spec via
rawTargeting while still overriding placements using the structured placements object.When both are set,
placements is converted to Meta snake_case and merged into rawTargeting before sending to Meta.Key fields:
•
rawTargeting (Meta TargetingSpec, snake_case)•
placements.publisherPlatforms: facebook, instagram, threads, messenger, audience_network•
placements.facebookPositions, placements.instagramPositions, placements.messengerPositions, placements.audienceNetworkPositions, placements.threadsPositions, placements.whatsappPositions, placements.devicePlatforms: mobile/desktopView documentation
❤1
Analytics post items now include
This lets you distinguish ad creatives from organic posts in analytics results (currently only available for LinkedIn posts; false when unavailable).
New field:
•
View documentation
isAd in AnalyticsListResponse.posts[].This lets you distinguish ad creatives from organic posts in analytics results (currently only available for LinkedIn posts; false when unavailable).
New field:
•
isAd (boolean) — true for ad creatives, otherwise falseView documentation
🔥2❤1
Inbox conversations now include ad-click attribution via a new
This lets you identify when a conversation started from a click-to-message ad (vs organic) and store the associated ad identifiers/details.
New field:
•
Common keys you may see in
• WhatsApp CTWA:
• Meta CTM/CTD:
View documentation
metadata object in responses from GET /v1/inbox/conversations and GET /v1/inbox/conversations/{conversationId}.This lets you identify when a conversation started from a click-to-message ad (vs organic) and store the associated ad identifiers/details.
New field:
•
metadata (object, nullable) — only present for ad-originated conversations; absent for organicCommon keys you may see in
metadata:• WhatsApp CTWA:
ctwa_clid, ctwa_source_id, ctwa_source_url, ctwa_headline, ctwa_source_type, ctwa_captured_at• Meta CTM/CTD:
meta_ad_id, meta_ad_title, meta_ad_source, meta_ad_type, meta_ad_ref, meta_ad_captured_at, meta_ad_photo_url, meta_ad_video_url, meta_ad_post_id, meta_ad_product_id, meta_ad_flow_idView documentation
❤1🔥1
GET
Key fields include
Geo targeting search via
View documentation
/v1/ads/lead-forms/{formId} now returns a fully detailed form object (enough to duplicate the form via POST /v1/ads/lead-forms).Key fields include
form.status (ACTIVE/ARCHIVED), questions, thank_you_page, and context_card.Geo targeting search via
GET /v1/ads/targeting/search now supports additional geoType values when dimension=geo: subcity, neighborhood, place, metro_area, geo_market (in addition to country, region, city, zip).View documentation
❤2