Inbox messages now include emoji reactions on supported platforms (WhatsApp / Telegram) via
This lets you display who reacted and when, alongside the message timeline.
New per-message field:
•
Sending messages now supports WhatsApp location and contact cards.
New request fields for
•
•
View documentation
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
This lets you read extra context like quoted replies and WhatsApp interactive/tap details without relying only on webhooks.
New field:
•
WhatsApp multipart sends now support voice note uploads via
Set
New multipart field:
•
View documentation
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:
•
•
Flow versioning metadata is now returned:
•
•
Cloning can now stay in the same lineage:
•
View documentation
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 accountIdFlow versioning metadata is now returned:
•
GET /v1/whatsapp/flows adds version and lineageId per flow•
POST /v1/whatsapp/flows response adds version and lineageIdCloning can now stay in the same lineage:
•
POST /v1/whatsapp/flows adds asVersion (only when using cloneFlowId)View documentation
👍2❤1
WhatsApp Flows now supports listing submitted flow responses via
This lets you fetch customer responses parsed from
Use:
•
•
•
Response items include
Also updated: when sending flows via
View documentation
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:
You can now look up a single pre-approved WhatsApp Template Library template by exact name to inspect its structure before importing—especially the
Required query params:
•
•
Response (
View documentation
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:
Returns
Provision (or fetch existing) dataset:
Returns
If the account token is missing
View documentation
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 accountIdReturns
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
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:
•
•
•
View documentation
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.contactIdView documentation
🔥2
New endpoint:
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:
Optional query:
Response includes per-event fields like
View documentation
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:
accountIdOptional 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
When sending an audio attachment, set
Key params:
•
•
•
Note: the audio must be
View documentation
/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
It fires once when a new DM conversation begins (first message exchange) and is platform-agnostic across
Key fields:
•
•
•
•
•
•
View documentation
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
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:
•
•
•
•
•
Note:
View documentation
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
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:
•
Applies to:
•
•
•
•
View documentation
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.startedView documentation
❤2
WhatsApp conversion events no longer require a Facebook Page ID on the account when calling
The endpoint now only requires
If you were setting account metadata with
View documentation
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:
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
• Session object
• Responses include
Also,
View documentation
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
sandboxNumberAlso,
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
You can use these to show engagement stats and recent activity without querying message history.
New fields:
• Contact:
• Channel:
View documentation
/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
This makes it explicit what Zernio bills you (Telnyx + recording) vs what Meta bills directly to your WABA (display-only).
New/updated billing fields:
•
•
•
Applies to:
•
•
• Webhook schema
View documentation
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
Set
Key property:
•
View documentation
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:
• List:
• List stats:
• Details/create responses:
View documentation
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.linkTrackingView documentation
🤯4❤2👏1
Comment-to-DM automations now support tagging contacts who click tracked links via
When
Use:
•
•
Returned in:
•
•
View documentation
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}: clickTagView documentation
👍2❤1
GET
This lets you report delivery/read performance for comment-to-DM automations (where supported) without extra calls.
New fields:
•
•
View documentation
/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
Comment-to-DM automations now support Instagram story reply triggers via a new
You can create automations that fire on keyword replies to stories (in addition to post comments). For story replies,
Use
•
•
Applies to:
•
•
View documentation
trigger field.You can create automations that fire on keyword replies to stories (in addition to post comments). For story replies,
platformPostId is the story media id (omit it to target any story).Use
trigger:•
comment•
story_replyApplies to:
•
POST /v1/comment-automations (new request field trigger, default comment)•
GET /v1/comment-automations and GET /v1/comment-automations/{automationId} (responses now include trigger)View documentation
❤1🔥1