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
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
GET /v1/ads/campaigns now supports filtering aggregated campaign metrics by a date range.

Use fromDate and toDate (YYYY-MM-DD, inclusive) to control the metrics window returned for each campaign.

New query params:
fromDate - start date (defaults to 90 days ago when both date params are omitted)
toDate - end date (defaults to today; max 730-day range)

View documentation
🔥1
Webhooks now support per-platform terminal post events: post.platform.published and post.platform.failed.

These fire once per platform target inside a post when that specific platform reaches a terminal state (published or permanent failure), which helps track multi-platform posts more precisely.

Subscribe via events on POST /v1/webhooks/settings or PUT /v1/webhooks/settings:
post.platform.published
post.platform.failed

A new webhook event is also available:
whatsapp.template.status_updated

View documentation
🔥1
{adId} in GET /v1/ads/{adId} and GET /v1/ads/{adId}/comments now accepts multiple identifier types.

You can call these endpoints using the Zernio internal _id (24-char hex), Meta numeric platformAdId (from comment.received as comment.ad.id), or the creative’s effective_object_story_id / effective_instagram_media_id. Any of these resolves to the same ad, so you don’t need a translation step.

View documentation
🔥2
POST /v1/posts now supports request idempotency via x-request-id.

If you send the same x-request-id again within ~5 minutes (including while the first request is in-flight), the API treats it as a retry and returns HTTP 200 with the original post in existingPost (no duplicate post is created).

Use x-request-id (UUID) per logical create call. If you omit it, each request is treated as new.

Duplicate protection still applies separately: identical content to the same (platform, accountId) within 24h returns HTTP 409 with details.accountId, details.platform, details.existingPostId.

View documentation
🔥1
Facebook now supports multi-link carousel posts via facebookSettings on POST /v1/posts.

This lets you publish a 2–5 card carousel where each image has its own click-through link (and optional headline/description).

Set facebookSettings.carouselCards (2–5 items) with:
link (required)
name (optional)
description (optional)

Optionally set facebookSettings.carouselLink for the carousel end-card destination.

Constraints: mediaItems must be images only, and must match carouselCards length/order. Mutually exclusive with facebookSettings.contentType = story or reel.

View documentation
🔥1
GET /v1/ads/tree now supports campaign-level sorting via a new sort query parameter.

This lets you control the order of returned campaigns (by recency or aggregated spend) while keeping pagination at the campaign level.

Use sort:
newest (default)
oldest
spend_desc
spend_asc

View documentation
2
GET /v1/ads/tree now supports campaign-level sorting via sort.

Use it to control the order of returned campaigns (by newest/oldest activity or by spend in the requested date range).

Set sort to:
newest (default)
oldest
spend_desc
spend_asc

View documentation
2🔥1
WhatsApp is now supported as a platform for connecting accounts and checking account health.

You can now use whatsapp with:
GET /v1/connect/{platform} (path param platform enum now includes whatsapp)
GET /v1/accounts/health (query param platform enum now includes whatsapp)

View documentation
2
Instagram now supports Stories retrieval + insights.

You can list currently-active stories and fetch metrics for a specific story, including a clear indicator of whether insights are live, cached, or unavailable.

New endpoints:
GET /v1/accounts/{accountId}/instagram/stories
Returns active stories (24h window). Key fields: id, mediaType, mediaUrl (nullable), permalink, thumbnailUrl, timestamp
GET /v1/accounts/{accountId}/instagram/stories/{storyId}/insights
Returns data.source = live | cached | unavailable and data.metrics including views, reach, replies, shares, navigation, tapsForward, tapsBack, exits, swipesForward, profileVisits, follows, reposts, totalInteractions.

View documentation
4🔥1
GET /v1/broadcasts/{broadcastId}/recipients now returns errorCode per recipient.

This provides the Meta WhatsApp error code to help you classify and handle delivery failures (only populated when status=failed).

New field: errorCode (integer, nullable) — e.g. 131049 (antispam), 131021 (invalid phone), 131026 (re-engagement required).

View documentation
3
GET /v1/ads/audiences now supports fetching custom audiences for LinkedIn and X (Twitter) ad accounts.

Use the platform query param with one of:
facebook, instagram, googleads, tiktok, tiktokads, pinterest, linkedin, linkedinads, twitter, xads

View documentation
🔥1
Webhooks now support message reaction events via the new reaction.received subscription.

Subscribe by including reaction.received in events when calling POST /v1/webhooks/settings or PUT /v1/webhooks/settings.

The reaction payload includes emoji, action (added | removed), platformMessageId, optional messageId, sender, and reactedAt.

View documentation
2
Google Business Profile verification is now supported via new GMB Verifications endpoints.

You can fetch verification status/history, discover eligible methods, start a verification (SMS/call/email/postcard), and complete it by submitting the PIN.

New endpoints:
GET /v1/accounts/{accountId}/gmb-verifications (optional locationId) returns voiceOfMerchantState.hasVoiceOfMerchant and verifications[].state = PENDING/COMPLETED/FAILED
POST /v1/accounts/{accountId}/gmb-verifications/options requires languageCode; returns options[].verificationMethod = ADDRESS/EMAIL/PHONE_CALL/SMS/AUTO/VETTED_PARTNER
POST /v1/accounts/{accountId}/gmb-verifications starts verification with method (+ method-specific fields like phoneNumber/emailAddress)
POST /v1/accounts/{accountId}/gmb-verifications/{verificationId}/complete completes with pin

Note: service-area businesses may require context (service address) when fetching options/starting verification.

View documentation
1
GET /v1/inbox/comments/{postId} now returns (Reddit only) post metadata alongside comments in a new post object.

This lets you render a post preview in the inbox/comments view without an additional Reddit fetch. post is null/absent for non-Reddit platforms and may be missing if the upstream post listing isn’t available.

Key fields in post: id, fullname, title, selftext, author, subreddit, permalink, url, score, numComments, createdUtc, over18, stickied, flairText, isGallery.

View documentation
🔥1
New endpoint POST /v1/ads/targeting/reach-estimate returns a normalized pre-flight audience reach estimate for a targeting spec before creating a campaign.

Send accountId + spec (same shape as TargetingSpec used by ads create). Optionally pass optimizationGoal.

Response includes available, and when available: lower, upper, optional daily, currency, and Meta-only estimateReady.

GET /v1/ads/interests is now deprecated. Use GET /v1/ads/targeting/search with dimension=interest (the deprecated alias still returns the legacy { interests: [...] } shape).

GET /v1/ads/targeting/search is now cross-platform and normalized. Use dimension = geo | interest | behavior | income, and for geo also geoType = country | region | city | zip | metro. Results return { results: [{ id, name, type, path?, audienceSize? }] }.

POST /v1/ads/create targeting now supports additional fields: zips, metros, customLocations, behaviors, incomeTier (top_5 | top_10 | top_10_25 | top_25_50), languages, savedTargetingId, specialAdCategories (HOUSING | EMPLOYMENT | CREDIT | ISSUES_ELECTIONS_POLITICS).

Audiences now support reusable targeting presets: POST /v1/ads/audiences accepts type=saved_targeting with spec (no adAccountId), and GET /v1/ads/audiences adds type filter and returns spec when type is saved_targeting.

View documentation
1
Meta Lead Gen is now supported end-to-end: you can manage Instant Forms and retrieve submitted leads via new Ads endpoints.

New endpoints:
• List all leads (cross-form CRM view): GET /v1/ads/leads with formId, accountId, since, limit, cursor
• Manage forms: GET /v1/ads/lead-forms, POST /v1/ads/lead-forms, GET /v1/ads/lead-forms/{formId}, DELETE /v1/ads/lead-forms/{formId}
• Form leads + testing: GET /v1/ads/lead-forms/{formId}/leads, POST /v1/ads/lead-forms/{formId}/test-leads

Ad creation update (Meta only): POST /v1/ads/create now accepts leadGenFormId. When goal is lead_generation, leadGenFormId is REQUIRED, and linkUrl is NOT required (the ad opens the form).

View documentation
3
New webhook payload schema added for Meta Lead Gen / Instant Forms leads: lead.received via WebhookPayloadLead.

This lets webhook consumers reliably parse incoming lead data (form, ad/campaign attribution when available, and submitted field answers).

Key properties:
event: lead.received
lead.id, lead.leadgenId, lead.formId, lead.formName
lead.adId, lead.adsetId, lead.campaignId (nullable)
lead.fields: flattened key → value map
lead.isOrganic, lead.createdAt
account.platform: facebook, account.id
timestamp

View documentation
😁2
PostAnalytics now includes Instagram Reels watch-time metrics.

You can retrieve average and total watch time for Reels (values are 0 for non-Reels media and other platforms).

New fields:
igReelsAvgWatchTime (ms)
igReelsVideoViewTotalTime (ms)

View documentation
🔥42
POST /v1/inbox/conversations now supports starting conversations on X/Twitter, Bluesky, Reddit, and WhatsApp (previously X/Twitter only).

You can initiate DMs across these platforms using participantId or participantUsername (platform-dependent).

WhatsApp requires an approved template to start a conversation: set templateName, templateLanguage, and optional templateParams (freeform initial messages aren’t allowed). message is now optional when using a WhatsApp template.

skipDmCheck remains X/Twitter only.

View documentation
3
Inbox messages now include emoji reactions on supported platforms (WhatsApp / Telegram) via reactions on each message.

This lets you display who reacted and when, alongside the message timeline.

New per-message field:
reactions[]: { emoji, fromMe, reactedAt }

Sending messages now supports WhatsApp location and contact cards.

New request fields for POST /v1/inbox/conversations/{conversationId}/messages:
location: { latitude, longitude, name?, address? }
contacts[]: contact card objects (requires name.formatted_name; optional phones[], emails[])

View documentation