Discord support has been added: you can now manage Discord account settings, list available guild channels, and post to Discord with Discord-specific options.
Manage Discord connection settings:
•
•
•
Post to Discord via
• Required:
• Optional:
Analytics responses now include
Ads goals have been expanded in
View documentation
Manage Discord connection settings:
•
GET /v1/accounts/{accountId}/discord-settings (read current channel/guild + webhook identity)•
PATCH /v1/accounts/{accountId}/discord-settings (update webhookUsername/webhookAvatarUrl and/or switch channelId)•
GET /v1/accounts/{accountId}/discord-channels (discover channels: type = 0/5/15)Post to Discord via
POST /v1/posts using platformSpecificData = DiscordPlatformData:• Required:
channelId• Optional:
embeds, poll, crosspost, forumThreadName, forumAppliedTags, threadFromMessage, tts, webhookUsername, webhookAvatarUrlAnalytics responses now include
platformPostId per platform in GET /v1/analytics.Ads goals have been expanded in
POST /v1/ads/boost and POST /v1/ads/create: goal now supports engagement, traffic, awareness, video_views, lead_generation, conversions, app_promotion (availability varies by platform).View documentation
❤2🔥2
Webhook comment.received payloads may now include
Handle missing internal IDs by relying on the platform IDs instead.
Fields that can now be
•
•
Use
View documentation
null for Zernio internal post IDs when the post was not published through Zernio.Handle missing internal IDs by relying on the platform IDs instead.
Fields that can now be
null:•
comment.postId•
post.idUse
comment.platformPostId / post.platformPostId as the stable identifiers in these cases.View documentation
❤1
Google Business Platform posts now support EVENT and OFFER types via
This lets you publish event and offer posts (in addition to standard updates) to Google Search/Maps/GBP.
Set
When
When
View documentation
topicType in GoogleBusinessPlatformData.This lets you publish event and offer posts (in addition to standard updates) to Google Search/Maps/GBP.
Set
topicType to: STANDARD | EVENT | OFFER (default: STANDARD)When
topicType is EVENT, include event (required): event.title, event.schedule.startDate, event.schedule.endDate (optional: startTime, endTime).When
topicType is OFFER, include offer (recommended): offer.offerType (OFFER | BUY_ONE_GET_ONE), offer.redeemOnlineUrl, offer.termsConditions, offer.couponCode.View documentation
❤2🔥1
New Google Business Profile (GBP) capabilities are available: manage Services, update Place Action links, and fetch Reviews across multiple locations in one call.
Manage location services:
•
•
Update a Place Action link:
•
•
Batch fetch reviews for multi-location accounts:
•
View documentation
Manage location services:
•
GET /v1/accounts/{accountId}/gmb-services (optional locationId)•
PUT /v1/accounts/{accountId}/gmb-services replaces the full list via serviceItems (structured or free-form, optional price)Update a Place Action link:
•
PATCH /v1/accounts/{accountId}/gmb-place-actions with name (required), and optionally uri and/or placeActionType•
placeActionType: APPOINTMENT, ONLINE_APPOINTMENT, DINING_RESERVATION, FOOD_ORDERING, FOOD_DELIVERY, FOOD_TAKEOUT, SHOP_ONLINEBatch fetch reviews for multi-location accounts:
•
POST /v1/accounts/{accountId}/gmb-reviews/batch with locationNames, optional pageSize (max 50) and pageTokenView documentation
❤1
Webhooks now support review events via
Sending inbox messages now supports WhatsApp rich interactive messages via
Set
Interactive taps/submissions are delivered in the
View documentation
events: review.new, review.updated (in POST /v1/webhooks/settings and PUT /v1/webhooks/settings).Sending inbox messages now supports WhatsApp rich interactive messages via
interactive in POST /v1/inbox/conversations/{conversationId}/messages.Set
interactive.type to: list, cta_url, or flow (WhatsApp only). When interactive is set, it takes priority over buttons and quickReplies.Interactive taps/submissions are delivered in the
message.received webhook under metadata: interactiveType (button_reply | list_reply | nfm_reply), interactiveId, flowResponseJson, flowResponseData.View documentation
🔥1
Reddit posting now supports native video submissions via new fields in
You can upload videos to Reddit’s CDN for an embedded player (with automatic fallback to a link post if video posts aren’t allowed), or submit silent looping clips.
New fields:
•
•
•
View documentation
RedditPlatformData.You can upload videos to Reddit’s CDN for an embedded player (with automatic fallback to a link post if video posts aren’t allowed), or submit silent looping clips.
New fields:
•
nativeVideo (boolean, default true) - use Reddit native video flow; set false to fall back to a legacy link post•
videogif (boolean) - submit as silent videogif when nativeVideo is active•
videoPosterUrl (uri) - optional thumbnail/poster image for native video postsView documentation
🔥1
PUT /v1/inbox/conversations/{conversationId} can now return 404.This happens when the conversation isn’t found on WhatsApp (other platforms upsert instead of returning not found).
Handle the new response:
404 Conversation not found.View documentation
🔥1
Meta ads now support Advantage Audience controls when creating/boosting ads and when updating Meta targeting.
This lets you explicitly enable/disable Meta’s targeting automation during ad set creation, and optionally preserve the current setting on updates.
Use:
•
•
•
View documentation
This lets you explicitly enable/disable Meta’s targeting automation during ad set creation, and optionally preserve the current setting on updates.
Use:
•
POST /v1/ads/boost: targeting.advantage_audience = 0 | 1•
PUT /v1/ads/{adId}: targeting.advantage_audience = 0 | 1 (omit to keep existing)•
POST /v1/ads/create: advantageAudience = 0 | 1View documentation
🔥2
Ad metrics now include conversion reporting and raw action breakdowns via new fields on
This lets you read conversion counts/cost directly and also extract any Meta action/conversion type from Insights without relying only on derived metrics.
New fields:
•
•
•
View documentation
AdMetrics.This lets you read conversion counts/cost directly and also extract any Meta action/conversion type from Insights without relying only on derived metrics.
New fields:
•
conversions (integer) — conversion events matching the campaign’s promoted event type (Meta-only for now; others return 0)•
costPerConversion (number) — spend / conversions (0 when conversions is 0)•
actions (object<string, integer>) — per action_type counts (e.g. link_click, offsite_conversion.fb_pixel_purchase)View documentation
❤4
New Ads API write endpoints are available for managing campaigns and ad sets (budget updates, pause/resume, duplication, deletion). This adds first-class support for CBO vs ABO budget routing and bulk status changes.
Campaign budget updates (CBO):
• Body:
• If the campaign is ABO, returns
Ad set updates (ABO budget and/or status):
• Body:
• If parent campaign is CBO and you try to update budget here, returns
Convenience ad set status toggle:
• Body:
Bulk pause/resume campaigns (up to 50):
• Body:
• Returns per-campaign results so one failure doesn’t fail the whole batch
Duplicate a campaign (Meta async copy + optional discovery):
• Key options:
Delete a campaign (cascades to ad sets/ads):
• Body:
Also added to campaign responses (
•
•
Meta-only for now where noted; other platforms may return
View documentation
Campaign budget updates (CBO):
PUT /v1/ads/campaigns/{campaignId}• Body:
platform (facebook|instagram), budget.amount, budget.type (daily|lifetime)• If the campaign is ABO, returns
409 (BUDGET_LEVEL_MISMATCH) — update the ad set insteadAd set updates (ABO budget and/or status):
PUT /v1/ads/ad-sets/{adSetId}• Body:
platform, optional budget, optional status (active|paused)• If parent campaign is CBO and you try to update budget here, returns
409 (BUDGET_LEVEL_MISMATCH)Convenience ad set status toggle:
PUT /v1/ads/ad-sets/{adSetId}/status• Body:
platform, status (active|paused)Bulk pause/resume campaigns (up to 50):
POST /v1/ads/campaigns/bulk-status• Body:
status (active|paused), campaigns[] with platformCampaignId + platform• Returns per-campaign results so one failure doesn’t fail the whole batch
Duplicate a campaign (Meta async copy + optional discovery):
POST /v1/ads/campaigns/{campaignId}/duplicate• Key options:
deepCopy (default true), statusOption (ACTIVE|PAUSED|INHERITED_FROM_SOURCE), syncAfter (default true)Delete a campaign (cascades to ad sets/ads):
DELETE /v1/ads/campaigns/{campaignId}• Body:
platform (facebook|instagram)Also added to campaign responses (
GET /v1/ads/campaigns and GET /v1/ads/tree):•
reviewStatus (in_review|approved|rejected|with_issues)•
budgetLevel (campaign|adset), campaignBudget, and currency to disambiguate CBO vs ABO budgetsMeta-only for now where noted; other platforms may return
501 for unsupported operations.View documentation
❤5🔥1
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