Ad metrics now include revenue and ROAS fields for Meta insights.
You can read monetary action totals via
•
•
Meta-only; other platforms return
View documentation
You can read monetary action totals via
actionValues (mirrors actions, values in ad-account currency), plus convenience rollups:•
purchaseValue — summed purchase-type action values•
roas — purchaseValue / spendMeta-only; other platforms return
{} for actionValues and 0 for purchaseValue/roas.View documentation
🔥2
POST /v1/ads/create now supports 3 mutually-exclusive request shapes (and has updated required fields).You can now (Meta-only) create multiple ads in one call via
creatives[], or attach a new ad to an existing ad set via adSetId.Key request options:
• Legacy single-creative: use top-level
goal, budgetAmount, budgetType, headline, body, imageUrl, linkUrl, callToAction• Multi-creative (Meta only): set
creatives[] (min 1). Each item requires headline, body, imageUrl, linkUrl, callToAction• Attach (Meta only): set
adSetId + a single creative at top-level; goal/budgetAmount/budgetType are inheritedcreatives[] and adSetId are mutually exclusive (400 if both). Non-Meta platforms with creatives[]/adSetId return 400.Response change: 201 may return either
ad (legacy/attach) or ads[] + platformCampaignId + platformAdSetId (multi-creative).View documentation
❤6
New analytics endpoints are available for YouTube, LinkedIn org pages, TikTok, Facebook Pages, and Instagram follower history. All new endpoints reuse the same response envelope as
YouTube channel totals (no per-video looping):
Key params:
Notes: requires
LinkedIn organization page aggregate analytics:
Key params:
Notes: requires scopes
TikTok account-level insights:
Key params:
Notes: requires
Facebook Page insights (post-Nov-2025 Meta metric names):
Key params:
Notes: deprecated Meta metrics (
Instagram follower history (daily follower count time series):
Key params:
Also added for LinkedIn personal analytics:
•
•
View documentation
/v1/analytics/instagram/account-insights for consistent client handling.YouTube channel totals (no per-video looping):
GET /v1/analytics/youtube/channel-insightsKey params:
accountId, metrics, since, until, metricType (total_value|time_series)Notes: requires
yt-analytics.readonly (412 if missing) + Analytics add-on; data is delayed 2–3 days (range clamped).LinkedIn organization page aggregate analytics:
GET /v1/analytics/linkedin/org-aggregate-analyticsKey params:
accountId, metrics, since, until, metricType (total_value|time_series)Notes: requires scopes
r_organization_social + r_organization_followers + r_organization_admin (412 if missing) + Analytics add-on; page-view metrics are total_value only.TikTok account-level insights:
GET /v1/analytics/tiktok/account-insightsKey params:
accountId, metrics, since, until, metricType (total_value|time_series)Notes: requires
user.info.stats (412 if missing) + Analytics add-on.Facebook Page insights (post-Nov-2025 Meta metric names):
GET /v1/analytics/facebook/page-insightsKey params:
accountId, metrics, since, until, metricType (total_value|time_series)Notes: deprecated Meta metrics (
page_impressions, page_fans, page_fan_adds, page_fan_removes) are rejected; use page_media_view, page_follows, etc. followers_gained/followers_lost are synthesized.Instagram follower history (daily follower count time series):
GET /v1/analytics/instagram/follower-historyKey params:
accountId, metrics (default follower_count,followers_gained,followers_lost), since, until, metricType (total_value|time_series)Also added for LinkedIn personal analytics:
•
GET /v1/accounts/{accountId}/linkedin-aggregate-analytics now supports POST_SAVE and POST_SEND in metrics•
GET /v1/accounts/{accountId}/linkedin-post-analytics now returns saves and sends (personal only; org returns 0)View documentation
❤4🔥1
Comment automation logs now include separate results for the DM and the optional public comment reply in
You can now track whether the DM was sent and whether the public reply was attempted/sent, with separate error messages.
New log fields:
•
•
•
•
View documentation
GET /v1/comment-automations/{automationId} and GET /v1/comment-automations/{automationId}/logs.You can now track whether the DM was sent and whether the public reply was attempted/sent, with separate error messages.
New log fields:
•
status (sent | failed | skipped) — DM outcome•
error — DM error if status is failed•
commentReplyStatus (sent | failed | skipped) — public reply outcome•
commentReplyError — public-reply error if commentReplyStatus is failedView documentation
🔥3
Webhooks now support the new event
This fires once per ads-enabled account when the initial discovery + 90-day ads backfill finishes (including partial success or failure), so you can trigger downstream processing when the initial ads dataset is ready.
Subscribe via
•
•
Event:
Payload highlights:
View documentation
account.ads.initial_sync_completed.This fires once per ads-enabled account when the initial discovery + 90-day ads backfill finishes (including partial success or failure), so you can trigger downstream processing when the initial ads dataset is ready.
Subscribe via
events on:•
POST /v1/webhooks/settings•
PUT /v1/webhooks/settingsEvent:
account.ads.initial_sync_completedPayload highlights:
account.accountId, account.profileId, account.platform, sync.status (success | failure), sync.totalAds, sync.synced, sync.failed, timestamp.View documentation
❤2
GET
Use it to return only posts published via a specific connected account (useful when multiple accounts exist per platform/profile).
New parameter:
•
View documentation
/v1/posts now supports filtering by social account via the optional query param accountId.Use it to return only posts published via a specific connected account (useful when multiple accounts exist per platform/profile).
New parameter:
•
accountId (string, 24-char hex ObjectId) — filter posts to those published via a specific social accountView documentation
❤1
New endpoints added for Click-to-WhatsApp ads and WhatsApp conversion attribution.
Create CTWA ads on Meta in one call via
Key fields:
Send WhatsApp conversation conversion events to Meta CAPI (business messaging) via
Key fields:
View documentation
Create CTWA ads on Meta in one call via
POST /v1/ads/ctwa (creates campaign → ad set → creative → ad).Key fields:
accountId, adAccountId, name, headline, body, budgetAmount, budgetType (daily | lifetime), and exactly one of imageUrl or video (url, thumbnailUrl). Optional: objective (OUTCOME_ENGAGEMENT | OUTCOME_SALES | OUTCOME_LEADS).Send WhatsApp conversation conversion events to Meta CAPI (business messaging) via
POST /v1/whatsapp/conversions.Key fields:
accountId, eventName (LeadSubmitted | Purchase | AddToCart | InitiateCheckout | ViewContent), eventId, optional eventTime, and at least one of conversationId or phoneE164. Note: returns 422 if no captured ctwa_clid (no attribution possible); on 200 check eventsFailed and failures[] for Meta rejections.View documentation
❤2🔥1
POST
Use this to restrict the audience by gender when creating Meta (facebook/instagram) ads; non-Meta platforms ignore it.
Set
View documentation
/v1/ads/create now supports Meta-only gender targeting via gender.Use this to restrict the audience by gender when creating Meta (facebook/instagram) ads; non-Meta platforms ignore it.
Set
gender to: • all (default) • male • femaleView documentation
❤1
GET
You can page through long conversations using an opaque cursor, and request oldest-first or newest-first results (with platform-specific limitations).
New query params:
•
•
•
New response fields:
•
•
•
Also:
View documentation
/v1/inbox/conversations/{conversationId}/messages now supports cursor-based pagination and sort order control.You can page through long conversations using an opaque cursor, and request oldest-first or newest-first results (with platform-specific limitations).
New query params:
•
limit (1–100, default 100)•
cursor (pass prior pagination.nextCursor)•
sortOrder: asc | desc (default asc)New response fields:
•
pagination.hasMore•
pagination.nextCursor•
sortOrderApplied: asc | descAlso:
WebhookPayloadMessage.metadata adds referral (WhatsApp only) for Click-to-WhatsApp ad attribution on the first inbound message after a CTWA ad click (e.g. ctwa_clid, source_url, image_url/video_url).View documentation
❤3
Meta ads now support DSA (EU) advertiser disclosures via two new optional fields on ad creation endpoints.
When your targeting intersects EU member states, Meta may require these values (enforced server-side) to comply with DSA Article 26.
Set:
•
•
Available on:
•
•
•
View documentation
When your targeting intersects EU member states, Meta may require these values (enforced server-side) to comply with DSA Article 26.
Set:
•
dsaBeneficiary — legal entity benefiting from the ad•
dsaPayor — legal entity paying for the ad (Meta spelling: dsa_payor)Available on:
•
POST /v1/ads/boost•
POST /v1/ads/create•
POST /v1/ads/ctwaView documentation
❤4
GET
Use these fields to align daily budget reset timing and Insights day boundaries with the ad account’s local timezone.
New fields in each item of
•
•
View documentation
/v1/ads/accounts now returns Meta ad account timezone details: timezoneName and timezoneOffsetHoursUtc.Use these fields to align daily budget reset timing and Insights day boundaries with the ad account’s local timezone.
New fields in each item of
accounts[]:•
timezoneName (IANA timezone, Meta only)•
timezoneOffsetHoursUtc (signed UTC offset in hours, reflects current DST, Meta only)View documentation
🔥4
GET
This provides a compact, public-facing view derived from GBP
New fields under
•
•
•
•
•
Populated when
View documentation
/v1/accounts/{accountId}/gmb-location-details now returns a new location summary object in the 200 response.This provides a compact, public-facing view derived from GBP
metadata, making it easy to surface “leave a review” and Maps URLs without parsing the raw metadata block.New fields under
location:•
name•
placeId•
reviewUrl•
mapsUri•
isVerifiedPopulated when
readMask includes metadata (default). For unverified/new locations, placeId/reviewUrl/mapsUri may be null.View documentation
❤3
Ads API now supports setting bid strategy on campaigns, ad sets, and boosted posts.
You can update campaign-level defaults via
Set
•
•
•
•
Boosting posts via
Ad read models now include
GBP location details (
View documentation
You can update campaign-level defaults via
PUT /v1/ads/campaigns/{campaignId} using bidStrategy (optionally alongside budget). Ad sets can now be updated via PUT /v1/ads/ad-sets/{adSetId} with bidStrategy plus bidAmount or roasAverageFloor when required.Set
bidStrategy to:•
LOWEST_COST_WITHOUT_CAP•
LOWEST_COST_WITH_BID_CAP (requires bidAmount)•
COST_CAP (requires bidAmount)•
LOWEST_COST_WITH_MIN_ROAS (requires roasAverageFloor)Boosting posts via
POST /v1/ads/boost now accepts bidStrategy, bidAmount, and roasAverageFloor. TikTok boosts also add linkUrl and callToAction.Ad read models now include
bidStrategy (normalized for Meta + TikTok) and may include bidAmount / roasAverageFloor on Ad, AdCampaign, and AdTree* responses.GBP location details (
GET /v1/accounts/{accountId}/gmb-location-details) now always includes title + metadata and always populates the derived location summary; passing location in readMask returns 400.View documentation
❤3
New Ads endpoints and expanded TikTok support.
You can now list TikTok Business Centers and trigger a full ads re-sync when permissions or accessible accounts change.
• List TikTok BCs:
• Re-sync an ads account:
TikTok campaign duplication is now supported via
Ad updates now support more platforms/fields:
•
Ad account listing now supports filtering/limiting:
•
TikTok boost now supports cross-creator Spark Ads:
•
Standalone ad creation “attach” mode now supports TikTok:
•
New response fields:
•
•
View documentation
You can now list TikTok Business Centers and trigger a full ads re-sync when permissions or accessible accounts change.
• List TikTok BCs:
GET /v1/ads/business-centers with accountId → returns businessCenters[] (bcId, name, advertiserCount)• Re-sync an ads account:
POST /v1/ads/sync/initial with accountId → returns status (queued | already_queued) + traceId; completion via webhook account.ads.initial_sync_completedTikTok campaign duplication is now supported via
POST /v1/ads/campaigns/{campaignId}/duplicate by setting platform to tiktok (Meta still supported).Ad updates now support more platforms/fields:
•
PUT /v1/ads/{adId} supports targeting + creative on facebook/instagram/tiktok. Other platforms return 501 (unsupported_platform_operation) when sending targeting or creative.Ad account listing now supports filtering/limiting:
•
GET /v1/ads/accounts adds optional adAccountId and limitTikTok boost now supports cross-creator Spark Ads:
•
POST /v1/ads/boost adds sparkAuthCodeStandalone ad creation “attach” mode now supports TikTok:
•
POST /v1/ads/create adSetId is now supported for tiktok (ad group ID)New response fields:
•
Ad adds platformAdAccountName and platformCreatedAt•
AdCampaign and AdTreeCampaign add platformAdAccountNameView documentation
❤3
Analytics endpoints now support filtering by social account via
This lets you scope results to a specific connected account (useful when a
Added optional query param
•
•
•
View documentation
accountId.This lets you scope results to a specific connected account (useful when a
profileId contains multiple accounts).Added optional query param
accountId on:•
GET /v1/analytics/best-time•
GET /v1/analytics/content-decay•
GET /v1/analytics/posting-frequencyView documentation
❤3
TikTok boost ads now surface clearer requirements and failure modes in
For TikTok boosts, include
The
Also note:
View documentation
POST /v1/ads/boost.For TikTok boosts, include
targeting.countries (ISO country codes). TikTok requires locations on the ad group; other platforms can omit it.The
422 response can now also indicate the connected TikTok user isn’t authorized as an Identity on the target advertiser (returned with code ads_connection_required and an actionable remediation message).Also note:
BusinessCenter.advertiserCount is now nullable (null when the BC asset walk is empty/failed, distinct from 0).View documentation
❤1
TikTok ads created via
This lets you set a CTA on TikTok using the same field you already use for Meta.
Set
•
View documentation
POST /v1/ads/create now honor callToAction (it’s passed through to the Spark Ad creative’s call_to_action).This lets you set a CTA on TikTok using the same field you already use for Meta.
Set
callToAction to one of:•
LEARN_MORE, SHOP_NOW, SIGN_UP, BOOK_TRAVEL, CONTACT_US, DOWNLOAD, GET_OFFER, GET_QUOTE, SUBSCRIBE, WATCH_MOREView documentation
❤2
New Meta geo targeting lookup endpoint:
It lets you resolve a human-readable location name into Meta’s opaque location
Call with
•
•
View documentation
GET /v1/ads/targeting/search.It lets you resolve a human-readable location name into Meta’s opaque location
key for use in ad targeting.Call with
accountId, q, optional type (country/region/city/subcity/neighborhood/zip/metro_area/geo_market, default city), optional countryCode, and optional limit.POST /v1/ads/create now supports Meta-only geo targeting via cities[] and regions[]:•
cities[]: { key, radius?, distance_unit? } where distance_unit is mile or kilometer•
regions[]: { key }countries[] is now documented as ISO-2 codes and defaults to ["US"] when no cities/regions are provided.View documentation
❤1
POST /v1/comment-automations now supports account-wide (any post) comment-to-DM automations.You can omit
platformPostId (and postId) to evaluate comments across every post on an account. Multiple account-wide automations can be stacked and run independently; per-post automations take priority on their post.Key request rules:
• Per-post: set
platformPostId and include postId• Account-wide: omit
platformPostId (and postId)•
matchMode: exact | containsNote:
409 now applies only to per-post automations (duplicate active platformPostId).View documentation
❤1
POST /v1/account-groups no longer requires profileId in the request body.You can now create an account group using only a name and the list of social account IDs.
Request body now requires:
•
name•
accountIdsView documentation
🔥2
Account groups can now include accounts across multiple profiles. For API keys scoped to specific profiles,
Meta ads connect can now be scoped to specific ad accounts via
Webhook
•
•
View documentation
GET /v1/account-groups only returns groups whose accountIds are all in allowed profiles.GET /v1/account-groups may now include createdBy and legacy profileId (only on older groups).POST /v1/account-groups accepts deprecated profileId (ignored) for backward compatibility.Meta ads connect can now be scoped to specific ad accounts via
GET /v1/connect/{platform}/ads (metaads only): adAccountId (format act_<digits>) or adAccountIds (repeat or comma-separated). Response may include scopedAdAccountIds.Webhook
account.ads.initial_sync_completed now includes richer correlation + error details:•
account.platformAdAccountId, account.platformAdAccountIds•
sync.error, sync.errorCode, sync.errorSubcode, sync.errorCategory = token_invalid | permission_denied | no_ad_accounts | rate_limited | discovery_failed | unknownView documentation
🔥3