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
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