Zernio | Developer News
702 subscribers
1 photo
1 video
497 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
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
Inbox messages now include platform-specific metadata on each message via messages[].metadata.

This lets you read extra context like quoted replies and WhatsApp interactive/tap details without relying only on webhooks.

New field:
messages[].metadata (free-form object; commonly includes quotedMessageId, waInteractive, and inbound tap fields like interactiveType / interactiveId)

WhatsApp multipart sends now support voice note uploads via voiceNote.

Set voiceNote to true when uploading an in-browser recorded audio so it’s transcoded to WhatsApp-native ogg/Opus.

New multipart field:
voiceNote: true (WhatsApp-only)

View documentation
2
WhatsApp Flows now support flow previews and version history.

You can fetch Meta’s embeddable web preview URL for a flow (drafts included), and list Zernio-tracked versions for a flow’s clone lineage.

New endpoints:
GET /v1/whatsapp/flows/{flowId}/preview with accountId and optional invalidate (mint a fresh link)
GET /v1/whatsapp/flows/{flowId}/versions with accountId

Flow versioning metadata is now returned:
GET /v1/whatsapp/flows adds version and lineageId per flow
POST /v1/whatsapp/flows response adds version and lineageId

Cloning can now stay in the same lineage:
POST /v1/whatsapp/flows adds asVersion (only when using cloneFlowId)

View documentation
👍21
WhatsApp Flows now supports listing submitted flow responses via GET /v1/whatsapp/flow-responses.

This lets you fetch customer responses parsed from nfm_reply webhook messages (newest first), and optionally scope them to a specific flow.

Use:
accountId (required)
flowId (optional)
limit (optional, max 200, default 50)

Response items include id, receivedAt, from, senderName, conversationId, flowToken, data, raw.

Also updated: when sending flows via POST /v1/whatsapp/flows/send, if flow_token is omitted it is now auto-generated as <flowId>:<uuid> so responses can be attributed to that flow in the Flow Responses view.

View documentation
1
New endpoint: GET /v1/whatsapp/template-library.

You can now look up a single pre-approved WhatsApp Template Library template by exact name to inspect its structure before importing—especially the buttons you must mirror when creating a template (e.g., URL/PHONE_NUMBER inputs).

Required query params:
accountId (WhatsApp social account ID)
name (exact library template name)

Response (200): template (object or null) with key fields like body_params and buttons where buttons[].type can be QUICK_REPLY, URL, PHONE_NUMBER, OTP, FLOW, ...

View documentation
2
WhatsApp now supports managing the Meta CTWA conversions dataset via two new endpoints.

Use these to detect whether Conversions API reporting is configured for a WhatsApp account and to provision the required Meta dataset (idempotent).

Check current dataset: GET /v1/whatsapp/dataset with accountId (query)
Returns datasetId (nullable).

Provision (or fetch existing) dataset: POST /v1/whatsapp/dataset with body accountId
Returns datasetId and created (boolean).

If the account token is missing whatsapp_business_manage_events, provisioning returns 422 (reconnect required).

View documentation
🔥1
Inbox webhooks now include a sender contactId when the sender matches a Zernio CRM Contact.

This lets you link inbound messages/reactions directly to a Contact (via the ContactChannel mapping) without an extra Contacts API lookup. The field is omitted when no contact exists (and typically for outgoing/business sender).

New field:
message.sender.contactId in message.received and message.sent
reaction.sender.contactId in reaction.received
InboxWebhookMessage.sender.contactId

View documentation
🔥2
New endpoint: GET /v1/whatsapp/conversions.

You can now fetch recent WhatsApp conversion send events (from delivery logs, ~30-day retention) to power a “recent activity” view without maintaining your own persistence.

Required query: accountId
Optional query: limit (1–200, default 50)

Response includes per-event fields like timestamp, eventName (LeadSubmitted, Purchase, AddToCart, InitiateCheckout, ViewContent), conversationId, eventsReceived, eventsFailed, traceId, durationMs.

View documentation
🔥2
POST /v1/inbox/conversations/{conversationId}/messages now supports WhatsApp voice messages (PTT) via voiceNote in the JSON body.

When sending an audio attachment, set voiceNote to true to send it as a WhatsApp voice note (waveform/voice-note UI) instead of a regular audio file.

Key params:
attachmentType: audio
attachmentUrl: public URL to the audio file
voiceNote: true (WhatsApp only)

Note: the audio must be .ogg encoded with OPUS (mono); other formats will be rejected by WhatsApp.

View documentation
3
New webhook event conversation.started is available via WebhookPayloadConversationStarted.

It fires once when a new DM conversation begins (first message exchange) and is platform-agnostic across instagram, facebook, telegram, whatsapp, twitter, reddit, bluesky.

Key fields:
event=conversation.started
conversation.id, conversation.platform, conversation.platformConversationId
conversation.status: active | archived
account
startedAt, timestamp
id (stable webhook event ID)

View documentation
1
CTWA ad creation now supports more precise geo targeting in POST /v1/ads/ctwa.

You can target by city/region/ZIP/metro or point-radius locations (useful for local WhatsApp campaigns) instead of relying only on country targeting.

New optional geo fields:
cities[] (with optional radius + distance_unit: mile | kilometer)
regions[]
zips[]
metros[]
customLocations[] (requires latitude, longitude, radius, distanceUnit: mile | kilometer)

Note: countries now defaults to ["US"] only when no other geo targeting (cities/regions/zips/metros/customLocations) is provided.

View documentation
🔥1
Inbox webhooks now include contactId on conversation (via InboxWebhookConversation).

This lets you join any inbox webhook event back to the Zernio CRM Contact (best-effort), without relying on the sender identity — useful for outgoing and delivery-status style events.

New field:
conversation.contactId - Zernio CRM Contact ID for the participant (omitted when no match or participantId is absent)

Applies to:
message.received
message.sent
reaction.received
conversation.started

View documentation
2
WhatsApp conversion events no longer require a Facebook Page ID on the account when calling POST /v1/whatsapp/conversions.

The endpoint now only requires metaCapiDatasetId (provision via POST /v1/whatsapp/dataset) and forwards the WABA ID as user_data.whatsapp_business_account_id for Meta attribution.

If you were setting account metadata with connectedFacebookPageId, you can stop—missing it will no longer cause 422. Missing metaCapiDatasetId can still return 422.

View documentation
🔥3
WhatsApp now supports Sandbox session management via new endpoints: GET /v1/whatsapp/sandbox/sessions, POST /v1/whatsapp/sandbox/sessions, DELETE /v1/whatsapp/sandbox/sessions/{sessionId}.

This lets you activate a test phone against the shared sandbox number (reply-to-activate), list non-expired sessions, and revoke access to block future sends.

Key fields:
• Create/refresh with phone (server normalizes to E.164)
• Session object WhatsAppSandboxSession: id, phoneE164, status (pending | active), expiresAt, activatedAt
• Responses include sandboxNumber

Also, GET /v1/whatsapp/phone-numbers now includes an optional sandbox object (or null) with phoneNumber, accountId, and allowed template (name, language), plus isSandbox = true.

View documentation
3
GET /v1/contacts/{contactId} now returns additional messaging activity fields on the contact and channels.

You can use these to show engagement stats and recent activity without querying message history.

New fields:
• Contact: messagesSentCount, messagesReceivedCount, lastMessageSentAt (nullable), lastMessageReceivedAt (nullable)
• Channel: lastActiveAt (nullable)

View documentation
👍1🔥1
WhatsApp call billing now includes billableCostUSD in call history, cost estimates, and call.ended webhooks.

This makes it explicit what Zernio bills you (Telnyx + recording) vs what Meta bills directly to your WABA (display-only).

New/updated billing fields:
billing.billableCostUSD - amount Zernio bills (excludes Meta)
billing.metaCostUSD - Meta per-minute charge (billed by Meta directly; display only)
billing.totalCostUSD - full cost including Meta (display only)

Applies to:
GET /v1/whatsapp/calls
GET /v1/whatsapp/calls/estimate (in breakdown)
• Webhook schema WebhookPayloadCallEnded (in call.billing)

View documentation
🔥1
X (Twitter) posts now support quote reposting via quoteTweetId in TwitterPlatformData.

Set quoteTweetId to a tweet ID (or full status URL) to publish a quote tweet. For threads, it applies to the first tweet only.

Key property:
quoteTweetId - mutually exclusive with media and poll; X only allows quoting your own posts or posts you’re mentioned in / part of the conversation thread of; billed at the standard create rate ($0.015).

View documentation
1
Comment-to-DM automations now support link tracking for DM button URLs, and the list endpoint includes click metrics.

When enabled, link buttons are wrapped in a tracked redirect so you can measure clicks and CTR.

New fields:
• Create/update: linkTracking (POST default: true; set false to send links untouched)
• List: automations[].linkTracking
• List stats: automations[].stats.linkClicks, automations[].stats.uniqueClicks
• Details/create responses: automation.linkTracking

View documentation
🤯42👏1
Comment-to-DM automations now support tagging contacts who click tracked links via clickTag.

When linkTracking is enabled, you can set clickTag so anyone who clicks a tracked link button in the DM gets tagged for segmentation (broadcasts/sequences).

Use:
POST /v1/comment-automations: clickTag (optional; requires linkTracking)
PATCH /v1/comment-automations/{automationId}: clickTag (empty string clears it)

Returned in:
GET /v1/comment-automations: clickTag
GET /v1/comment-automations/{automationId}: clickTag

View documentation
👍21
GET /v1/comment-automations now returns additional automation stats: stats.delivered and stats.read.

This lets you report delivery/read performance for comment-to-DM automations (where supported) without extra calls.

New fields:
stats.delivered - DMs confirmed delivered (Messenger; IG emits no delivery receipt)
stats.read - DMs confirmed read (IG messaging_seen / Messenger message_reads)

View documentation
1🔥1