Send WhatsApp conversion event
Forward a WhatsApp Business Messaging conversion event (LeadSubmitted,
Purchase, AddToCart, InitiateCheckout, ViewContent) to Meta's
Conversions API with action_source = business_messaging and
messaging_channel = whatsapp. The endpoint looks up the originating
CTWA click ID (ctwa_clid) captured on the first inbound message of
the conversation and replays it on every event so Meta can attribute
the conversion back to the Click-to-WhatsApp ad that drove the chat.
Configuration prerequisite on the WhatsApp account metadata:
metaCapiDatasetId: the Meta dataset ID linked to the WABA. Provision one withPOST /v1/whatsapp/dataset.
The WABA ID (already set automatically at connect time) is forwarded as
user_data.whatsapp_business_account_id, which is the per-channel
attribution identifier Meta requires for WhatsApp events. No Facebook
Page ID is needed (that field is the Messenger-branch identifier).
Identify the conversation by either conversationId (preferred) or
phoneE164 (digits only, no +). At least one is required. If the
conversation has no captured ctwa_clid, the request returns 422
because there is nothing to attribute.
Token and dataset coupling: the WhatsApp account's accessToken must
have access to the configured metaCapiDatasetId. By default a WABA's
system-user token is scoped to the WABA's own Business Manager and
cannot post to a pixel owned by a different Business; Meta returns
code 100 in that case. Either share the dataset with the WhatsApp
app's Business in BM, or use a dataset already in the same Business
as the WABA.
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
In addition to the required list, at least one of
conversationId or phoneE164 must be supplied (used to
resolve the originating CTWA conversation). The route enforces
this at the Zod boundary; OpenAPI's required cannot express
OR-required cleanly.
Response Body
application/json
application/json
{ "platform": "metaads", "eventsReceived": 0, "eventsFailed": 0, "failures": [ { "eventIndex": 0, "eventId": "string", "message": "string", "code": "string" } ], "traceId": "string"}List conversion events
Returns the most recent conversion events sent through `POST /v1/whatsapp/conversions` for the given WhatsApp account. Sourced from delivery logs (Axiom `late` dataset), so the visible window is bounded by log retention (about 30 days). Useful for rendering a "recent activity" panel on the conversions setup tab without standing up a parallel persistence layer. Per-event payload mirrors the structured log we write on every successful send: `eventName`, `conversationId`, `eventsReceived`, `eventsFailed`, `traceId`, `durationMs`, and the wall-clock `timestamp`.
List account notifications
Returns Meta-originated events recorded for a WhatsApp account, newest first: template review outcomes (approved, rejected, paused, category changes) and WABA status changes (restricted, disabled, reinstated, disconnected). Events are captured from Meta webhooks as they happen; the feed starts at the account's first recorded event and is not backfilled. Complements the push events `whatsapp.template.status_updated` and `account.disconnected` with a pollable history.