Messaging

Messaging

Contacts, conversations, messages, media and templates. The resources behind sending and reading customer messages.

Live

The API reference is generated from the running API's own specification and lists every field of every operation below.

The model

ResourceWhat it is
ConnectionOne connected channel account: a WhatsApp number, an inbox. Live.
ContactA person, merged across channels. One contact can have a WhatsApp number, an email address and an Instagram handle.
IdentityOne way to reach a contact: a channel plus the id on it, such as whatsapp + +447700900123.
ConversationA contact on one connection: a thread with a status, an assignee and tags.
MessageOne item in a conversation: inbound or outbound, text, media, template or interactive.
MediaA file you upload with POST /v2/media to send. A file already on a message (one a customer sent, or one you sent) is downloaded through that message.
TemplateAn approved WhatsApp message template.

Endpoints

EndpointScope
POST /v2/messagesmessages:writeSend a message
GET /v2/messages/{id}messages:readOne message
GET /v2/messages/{id}/status-historymessages:readIts delivery history
GET /v2/messages/{id}/attachments/{index}messages:readA short-lived download link for a file on a message
GET /v2/conversationsconversations:readList conversations
GET /v2/conversations/{id}conversations:readOne conversation
PATCH /v2/conversations/{id}conversations:writeStatus, assignee, team, topic, tags, priority
POST /v2/conversations/{id}/readconversations:writeMark read
GET /v2/conversations/{id}/messagesmessages:readA conversation's messages
POST /v2/conversations/{id}/notesconversations:writeAdd an internal note
GET /v2/contacts, POST /v2/contactscontacts:read, contacts:writeList, create
GET, PATCH /v2/contacts/{id}contacts:read, contacts:writeOne contact
DELETE /v2/contacts/{id}contacts:write + the member's erasure rightErase a contact (GDPR, irreversible). See Contacts
PUT /v2/contacts/by-identity/{channel}/{externalId}contacts:writeCreate or update by channel identity
GET, POST /v2/contacts/{id}/identities, DELETE …/identities/{identityId}contacts:read, contacts:writeA contact's handles
POST /v2/contacts/{id}/tags, DELETE …/tags/{tag}contacts:writeTag, untag
POST /v2/contacts/{id}/mergecontacts:writeMerge another contact into this one
POST /v2/mediamedia:writeGet an upload URL
GET /v2/media/{id}media:readGet a short-lived download URL
GET /v2/templates, GET /v2/templates/{id}templates:readWhatsApp templates

Which keys can call them

Every messaging endpoint needs a live key that is not pinned to an App. A test key gets 403 forbidden with reason sandbox_key_not_supported, and a key pinned to an App gets 403 forbidden with reason key_pinned_to_projects: these endpoints read and write real customer data that belongs to no single App. The one exception is GET /v2/templates, which a test key may read. See Test keys.

Visibility

A key sees what its member sees in the console. For conversations and messages, that is the member's own, their team's, or all, depending on their role. Contacts are visible workspace-wide to anyone with contact access, as in the console. See Keys belong to a person.

Sent as you, marked as the API

A message sent with a key is sent as the key's member and appears in the console like any other reply, marked as sent through the API. API sends do not count as a person taking over from the AI assistant.

On this page