Zernio | Developer News
706 subscribers
1 photo
1 video
498 links
This channel is for recurrent updates and announcements on https://zernio.com.

Zernio is a Social API for Posting and Analytics on 14 platforms.
Download Telegram
Account groups can now include accounts across multiple profiles. For API keys scoped to specific profiles, 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 | unknown

View documentation
🔥3
POST /v1/inbox/comments/{postId}/{commentId}/private-reply now supports optional quick reply chips on the first private reply.

You can include up to 13 chips to let users pick an intent in-app (Instagram/Messenger apps only).

New optional field: quickReplies (max 13)
quickReplies[].title (max 20 chars)
quickReplies[].payload
quickReplies[].imageUrl (optional)

View documentation
2
WhatsApp headless OAuth now supports multi-phone WABA selection via a new two-step flow.

When the OAuth redirect includes step=select_phone_number, first list available numbers with GET /v1/connect/whatsapp/select-phone-number using profileId + tempToken (optional X-Connect-Token).

Then bind the chosen number with POST /v1/connect/whatsapp/select-phone-number:
profileId
tempToken
wabaId
phoneNumberId

Note: GET /v1/connect/pending-data is now documented as only for LinkedIn organizations and Snapchat profiles; WhatsApp selection state is passed via redirect params and pending-data may return 404 for WhatsApp flows.

View documentation
🔥2
POST /v1/inbox/comments/{postId}/{commentId}/private-reply now supports inline buttons on the first private reply.

You can attach 1–3 buttons rendered in the same message bubble (Meta button_template). This is recommended for cold reach because quickReplies don’t render in Instagram Message Requests.

New request field: buttons (min 1, max 3), mutually exclusive with quickReplies.
Button types:
url: { type, title, url }
postback: { type, title, payload }
phone (Facebook only): { type, title, phone }

View documentation
🔥3
Ads analytics endpoints now support up to a 730-day metrics date range (previously 90 days).

You can query longer historical performance, and requests for ranges older than 90 days may trigger a one-time on-demand fetch from the ad platform, then be served from cache on subsequent requests.

Applies to:
GET /v1/ads (max range 730 days)
GET /v1/ads/tree (max range 730 days)
GET /v1/ads/{adId}/analytics (max range 730 days)

Use fromDate / toDate; ranges older than 90 days may require scoping to accountId (where noted) to trigger the on-demand fetch.

View documentation
🔥31
Webhooks now support additional message events you can subscribe to when creating/updating webhook settings.

This lets you receive callbacks for outbound message lifecycle changes (send/edit/delete/delivery/read/failure), not just inbound messages.

Use events in POST /v1/webhooks/settings or PUT /v1/webhooks/settings with any of:
message.sent, message.edited, message.deleted, message.delivered, message.read, message.failed

Also added to WebhookPayloadMessage.metadata (Instagram only): storyReply and isStoryMention.

View documentation
🔥3
Message webhooks now include expanded Meta ad-click attribution in metadata.referral (in addition to WhatsApp CTWA).

This lets you attribute the first inbound message to a specific Facebook/Instagram ad click for CTM/CTD flows.

New fields in metadata.referral:
ad_id
ref
source
type
ads_context_data (object: ad_title, photo_url, video_url, post_id, product_id, flow_id)

metadata.referral is now nullable and is only populated on the first inbound message after the click.

View documentation
🔥2
WhatsApp is now supported on POST /v1/inbox/conversations/{conversationId}/typing.

On WhatsApp, the typing indicator shows typing... for up to 25 seconds. It requires a recent inbound message in the conversation (Meta references the inbound message id) and will also mark that inbound message as read as a side-effect.

Use: { "accountId": "..." }

View documentation
🔥1
X API pricing/usage reporting now includes a new $0.200 “posts with URL” operation and tier.

This lets you attribute X spend more accurately per action; new clients should rely on per-operation counts rather than tier aggregates.

Key changes:
• New operation in GET /v1/billing/x-pricing: operation=content_create_with_url with tier=x_api_200 and pricePerCallUsd=0.2
content_create price moved to pricePerCallUsd=0.015 (now tier=x_api_015)
• In GET /v1/usage-stats, usage.xApiCalls is now deprecated and excludes x_api_200 (and future tiers); use usage.xApiCallsByOperation as the source of truth

View documentation
🔥1
Comment-to-DM automations now support inline DM buttons via buttons.

You can attach up to 3 buttons to the auto-DM (URL, postback, or phone on Facebook) to drive clicks or capture postbacks.

Use buttons in:
POST /v1/comment-automations
PATCH /v1/comment-automations/{automationId} (pass buttons: [] to clear)

Button schema: { type, title, url|payload|phone } where type is url | postback | phone (phone = Facebook-only), and title is max 20 chars.

Note: when buttons is non-empty, dmMessage must be ≤ 640 characters. Responses from list/get/create/update may now include buttons (omitted when none are set).

View documentation
1
Meta Ads now supports managing Tracking Tags (Meta Pixels) via new endpoints.

You can list/create/get/update pixels, share/unshare them across ad accounts, and fetch aggregated event stats.

New endpoints:
GET /v1/accounts/{accountId}/tracking-tags (optional adAccountId=act_...)
POST /v1/accounts/{accountId}/tracking-tags body: adAccountId, name (not idempotent)
GET /v1/accounts/{accountId}/tracking-tags/{tagId} (includes install code)
PATCH /v1/accounts/{accountId}/tracking-tags/{tagId} fields: name, enableAutomaticMatching, automaticMatchingFields (em/ph/fn/ln/ge/db/ct/st/zp/country/external_id), firstPartyCookieStatus (empty/first_party_cookie_disabled/first_party_cookie_enabled), dataUseSetting (advertising_and_analytics/analytics_only/empty)
GET|POST|DELETE /v1/accounts/{accountId}/tracking-tags/{tagId}/shared-accounts (DELETE supports adAccountId query)
GET /v1/accounts/{accountId}/tracking-tags/{tagId}/stats (optional aggregation, startTime, endTime; aggregation enum includes event, url, device_type, browser_type, etc.)

Notes: Meta-only (platform=metaads; other platforms return 405). Requires the Meta ads SocialAccount from the Ads add-on connect flow; list view omits code (use get to retrieve it).

View documentation
2
GET /v1/ads/{adId}/comments now returns additional Instagram metadata in meta for Instagram-placed ads.

This makes it easier to identify the boosted IG post and which connected Instagram account was used to read comments (useful for follow-up reply/hide actions via /v1/inbox/comments).

New meta fields (Instagram-only):
instagramUserId
instagramPermalink
instagramAccountId

Also clarified: for Instagram-placed ads, if no connected Instagram account on the profile can read the ad’s media, the endpoint returns 422 with code ads_connection_required.

View documentation
1
Meta ads (boosted/dark posts) are now included in GET /v1/inbox/comments for users with the Ads add-on (Metronome plans always qualify).

Ad rows are flagged so you can route comment fetching to the ads comments thread.

Use platform:
metaads - ads only
facebook/instagram - organic only
• omit platform - both

New fields on inbox rows: isAd (boolean), adId (string). For ad rows, fetch the thread via GET /v1/ads/{adId}/comments.

GET /v1/inbox/comments/{postId} now returns meta.adComments when a boosted post has no organic comments (includes adId and adCommentsUrl), and may return 400 with code USE_AD_COMMENTS_ENDPOINT when postId is an ad creative/ad ID.

GET /v1/ads adds filters to map Business Manager IDs back to Zernio ads: platformAdId, effectiveObjectStoryId, effectiveInstagramMediaId.

View documentation
🔥3
POST /v1/ads/create now supports creating LinkedIn standalone ads.

This creates a LinkedIn Single Image Ad backed by a Direct Sponsored Content ("dark post") authored by a Company Page, with supported goals engagement, traffic, awareness (and traffic requires linkUrl).

Key request fields for LinkedIn:
organizationId (Company Page org ID or urn:li:organization:N; required unless it can be inferred)
headline (now required for LinkedIn; max 400)
body (used as LinkedIn post commentary)
imageUrl (required for LinkedIn)
linkUrl (required for goal=traffic)
longHeadline (optional secondary description on LinkedIn traffic ads)

Also updated:
callToAction enum expanded with REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, BUY_NOW
• Meta-only: new attributionSpec to control conversion attribution windows (CLICK_THROUGH/VIEW_THROUGH/ENGAGED_VIDEO_VIEW with windowDays 1/7/28).

View documentation
3
TikTok conversion ads via POST /v1/ads/create now support/require TikTok pixel optimization settings through promotedObject.

For TikTok, goal=conversions uses promotedObject to configure the ad group’s pixel + optimization event (or inherit them by using adSetId).

Set:
goal: conversions
promotedObject.pixelId (required for TikTok conversions)
promotedObject.customEventType (optional TikTok optimization_event code, e.g. ON_WEB_ORDER, INITIATE_ORDER, ON_WEB_CART, ON_WEB_REGISTER, FORM, ON_WEB_DETAIL)

View documentation
1
New endpoint: PATCH /v1/accounts/{accountId} to move a connected account to a different profile owned by the same user.

Send profileId in the JSON body to set the target profile.

Request body:
profileId (required)

Auth/scope note: for profile-restricted API keys, both the account’s current profile and the target profileId must be allowed, otherwise you’ll get 403.

Responses: 200 returns message and profileId; errors include 400, 401, 403, 404.

View documentation
🔥1
New endpoint GET /v1/ads/timeline returns a daily time series of aggregate ad metrics for a social account (one row per calendar day), useful for spend/conversions charts without calling /v1/ads/tree per day.

Key params:
accountId (required)
fromDate, toDate (YYYY-MM-DD; defaults to last 90 days; max 730 days)
platform (optional): facebook, instagram, tiktok, linkedin, pinterest, google, twitter

Response: rows[] with per-day metrics like spend, impressions, clicks, ctr, conversions, actions, purchaseValue, roas. Returns empty rows if no activity. 403 if Ads add-on is required.

View documentation
🔥1
GET /v1/ads/timeline now supports filtering by a specific platform ad account via adAccountId.

Use this when a single Zernio connection wraps multiple platform ad accounts and you want the timeline chart for just one (e.g. Meta act_…, TikTok advertiser ID).

New query param:
adAccountId (optional)

Note: rows ingested before 2026-05-13 may not include this dimension yet; the recurring 7-day re-sync will repopulate them over time.

View documentation
🔥1
Webhooks now support ad.status_changed.

Subscribe to get notified when a Meta ads object (campaign/ad set/ad) changes status or enters WITH_ISSUES.

Add ad.status_changed to events when creating/updating a webhook via POST /v1/webhooks/settings or PUT /v1/webhooks/settings.

Payload highlights:
event: ad.status_changed
adObject.level: CAMPAIGN | AD_SET | AD
status.raw: platform-native status (e.g. ACTIVE, PAUSED, WITH_ISSUES)
error: optional diagnostics on most WITH_ISSUES events

Also, GET /v1/ads/{adId}/analytics now returns ad.currency (ISO 4217) so you can interpret money values in summary and daily.

View documentation
2👍1
Google Business reviews now support owner replies via new endpoints: POST /v1/accounts/{accountId}/gmb-reviews/{reviewId}/reply and DELETE /v1/accounts/{accountId}/gmb-reviews/{reviewId}/reply.

Use comment to post/update a reply (calling POST again overwrites the previous reply). Deleting removes only the reply, not the review.

Reply body: { "comment": "..." }

POST /v1/ads/ctwa now supports creating multiple CTWA ads under one campaign/ad set by sending a non-empty creatives[] array (each creative has its own headline, body, and exactly one of imageUrl/video). Single-creative requests still work.

New optional bidding controls on CTWA: bidStrategy (LOWEST_COST_WITHOUT_CAP, LOWEST_COST_WITH_BID_CAP, COST_CAP, LOWEST_COST_WITH_MIN_ROAS) plus bidAmount (required for bid-cap/cost-cap) and roasAverageFloor (required for min-ROAS).

CTWA create response is now a tagged union via adType: single or multi.

View documentation
1🔥1
Webhooks now support WhatsApp template status updates via the new event whatsapp.template.status_updated.

This fires when Meta completes a (re)review of a template on a connected WABA, so you can react to approvals/rejections and other status transitions.

Subscribe by adding whatsapp.template.status_updated to Webhook.events.

Payload: WebhookPayloadWhatsAppTemplateStatusUpdated with template.statusAPPROVED, REJECTED, PENDING, PAUSED, DISABLED, IN_APPEAL, PENDING_DELETION and template.reason (e.g. "NONE" on approval).

View documentation
1