Skip to content

Endpoint reference

Generated from the same table the server uses to register routes, so it always matches what is live. Path segments in braces are parameters.

Contacts

GET /api/ext/v3/contacts

List contacts, newest first.

Any of these scopes: contacts:read, contacts:write · returns contact_list (paginated)

Query

  • page_number (integer) 1-based page. Default 1. page_number x page_size must not exceed 10,000 (400 beyond that).
  • page_size (integer) Items per page, 1 to 100. Default 20.
  • tag (string) Only contacts carrying this tag.
  • search (string) Matches name or phone number.

GET /api/ext/v3/contacts/count

Count contacts, optionally only those with a tag or matching a search.

Any of these scopes: contacts:read, contacts:write · returns count

Query

  • tag (string) Only contacts carrying this tag.
  • search (string) Matches name or phone number.

GET /api/ext/v3/contacts/{target}

Get one contact by phone number, contact id, external_id:<value> or bsuid:<value>.

Any of these scopes: contacts:read, contacts:write · returns contact

POST /api/ext/v3/contacts

Create a contact. Answers 409 when the phone number or external id already exists.

Scope contacts:write · returns contact

Body

  • phone_number (string, required) Digits with country code; a leading + is optional.
  • name (string) Display name, up to 200 characters.
  • external_id (string) Your own identifier, stored as an attribute and usable as external_id:<value> in paths.
  • tags (array of string) Up to 50 tags.
  • custom_params (array of { name, value }) Contact attributes. A null value removes the attribute on update.
  • opt_in (boolean) Set true only if the person agreed to receive messages.
  • opt_in_source (string) Where the consent was collected. Required when opt_in is true.

PUT /api/ext/v3/contacts/{target}

Change name, tags or attributes. Attributes are merged, tags are replaced when sent.

Scope contacts:write · returns contact

Body

  • name (string) New display name.
  • tags (array of string) Replaces the full tag list.
  • custom_params (array of { name, value }) Contact attributes. A null value removes the attribute on update.

DELETE /api/ext/v3/contacts/{target}

Delete a contact together with its conversations and messages. This cannot be undone.

Scope contacts:write · returns ok

POST /api/ext/v3/contacts/{target}/tags

Add tags to a contact, keeping the ones it already has.

Scope contacts:write · returns contact

Body

  • tags (array of string, required) Tags to add.

DELETE /api/ext/v3/contacts/{target}/tags/{tag}

Remove one tag from a contact. Removing a tag the contact lacks succeeds.

Scope contacts:write · returns contact

PUT /api/ext/v3/contacts/{target}/attributes

Merge attributes into a contact without touching name or tags.

Scope contacts:write · returns contact

Body

  • custom_params (array of { name, value }, required) Contact attributes. A null value removes the attribute on update.

Conversations

GET /api/ext/v3/conversations

List conversations, most recently active first.

Any of these scopes: conversations:read, conversations:write · returns conversation_list (paginated)

Query

  • page_number (integer) 1-based page. Default 1. page_number x page_size must not exceed 10,000 (400 beyond that).
  • page_size (integer) Items per page, 1 to 100. Default 20.
  • status (string) open, pending, solved or blocked.
  • target (string) Only conversations of this contact (phone, id, external_id:<value> or bsuid:<value>).

GET /api/ext/v3/conversations/{target}

One conversation by conversation id, or the most recently active one of a contact (phone, contact id, external_id:<value> or bsuid:<value>).

Any of these scopes: conversations:read, conversations:write · returns conversation

GET /api/ext/v3/conversations/{target}/messages

Message history, newest first. The target is a conversation id, or a contact whose conversations are all included.

Any of these scopes: conversations:read, conversations:write · returns message_list (paginated)

Query

  • page_number (integer) 1-based page. Default 1. page_number x page_size must not exceed 10,000 (400 beyond that).
  • page_size (integer) Items per page, 1 to 100. Default 20.

POST /api/ext/v3/conversations/{target}/messages/text

Send a session (free-form) message to a conversation id or a contact (phone, contact id, external_id:<value> or bsuid:<value>). Needs an open 24-hour window; answers 409 otherwise.

Any of these scopes: messages:write, conversations:write · returns message

Body

  • text (string, required) Message text, up to 4096 characters.
  • channel (string) Meta phone_number_id to send from. Defaults to your first connected number.
  • local_message_id (string) Your own id. A repeat of the same id to the same recipient within 24 hours returns the first result and sends nothing; the same id with a different message answers 422.

PUT /api/ext/v3/conversations/{target}/status

Change the status of a conversation.

Scope conversations:write · returns conversation

Body

  • status (string, required) open, pending, solved or blocked.

PUT /api/ext/v3/conversations/{target}/assignee

Assign a conversation to a member of the workspace, or unassign it.

Scope conversations:write · returns conversation

Body

  • user_id (string or null, required) Id of a workspace member, or null to unassign.

POST /api/ext/v3/conversations/{target}/tags

Add tags to a conversation, keeping the ones it already has.

Scope conversations:write · returns conversation

Body

  • tags (array of string, required) Up to 10 tags of up to 40 characters each.

DELETE /api/ext/v3/conversations/{target}/tags/{tag}

Remove one tag from a conversation. Removing a tag the conversation lacks succeeds.

Scope conversations:write · returns conversation

Templates

GET /api/ext/v3/messageTemplates

List message templates.

Any of these scopes: templates:read, messages:write · returns message_template_list (paginated)

Query

  • page_number (integer) 1-based page. Default 1. page_number x page_size must not exceed 10,000 (400 beyond that).
  • page_size (integer) Items per page, 1 to 100. Default 20.
  • status (string) draft, pending, approved, rejected, paused or disabled.

GET /api/ext/v3/messageTemplates/{id}

One message template by id, with its components and review status.

Any of these scopes: templates:read, messages:write · returns message_template

POST /api/ext/v3/messageTemplates/send

Send an approved template to up to 100 recipients, including templates with a media header or a link button. Each recipient is answered on its own: accepted means we queued the message for sending, not that it was delivered. Follow delivery with the message.status webhook or the message history.

Scope messages:write · returns per-recipient results

Body

  • template_name (string, required) Name of an approved template.
  • language (string) Template language code. Needed only when the name exists in several languages.
  • broadcast_name (string) Accepted for compatibility and echoed back; no broadcast record is created.
  • channel (string) Meta phone_number_id to send from.
  • recipients (array, required) Each item: phone_number, or bsuid for a person who messaged you through a WhatsApp username (one of the two is required), local_message_id (optional, dedupes for 24 hours), custom_params (array of { name, value } filling {{1}}, {{2}}... in order), header_param (text for a header placeholder, or the public https link of an image, video or document header), button_params (array of { index, value } for link buttons whose url has a placeholder, index counting buttons from 0).

Broadcasts

GET /api/ext/v3/broadcasts

List broadcasts with delivery counts.

Scope broadcasts:read · returns broadcast_list (paginated)

Query

  • page_number (integer) 1-based page. Default 1. page_number x page_size must not exceed 10,000 (400 beyond that).
  • page_size (integer) Items per page, 1 to 100. Default 20.

GET /api/ext/v3/broadcasts/{id}

One broadcast with its delivery status summary.

Scope broadcasts:read · returns broadcast

GET /api/ext/v3/broadcasts/{id}/recipients

Per-recipient delivery status.

Scope broadcasts:read · returns recipient_list (paginated)

Query

  • page_number (integer) 1-based page. Default 1. page_number x page_size must not exceed 10,000 (400 beyond that).
  • page_size (integer) Items per page, 1 to 100. Default 20.
  • status (string) pending, queued, sent, delivered, read, failed or skipped.

Webhooks

GET /api/ext/v3/webhooks/event-types

Event names you can subscribe to.

Scope webhooks:manage · returns event_types

GET /api/ext/v3/webhooks

List webhook subscriptions.

Scope webhooks:manage · returns webhook_list (paginated)

Query

  • page_number (integer) 1-based page. Default 1. page_number x page_size must not exceed 10,000 (400 beyond that).
  • page_size (integer) Items per page, 1 to 100. Default 20.

POST /api/ext/v3/webhooks

Subscribe a public HTTPS URL. The signing secret is returned once.

Scope webhooks:manage · returns webhook

Body

  • url (string, required) Public https URL.
  • event_types (array of string, required) Names from the event-types endpoint.
  • status (string) enabled (default) or disabled.

GET /api/ext/v3/webhooks/{id}

One webhook subscription.

Scope webhooks:manage · returns webhook

PUT /api/ext/v3/webhooks/{id}

Change the URL, events or status. Enabling resets the failure count.

Scope webhooks:manage · returns webhook

Body

  • url (string) New public https URL.
  • event_types (array of string) Replaces the subscribed events.
  • status (string) enabled or disabled.

DELETE /api/ext/v3/webhooks/{id}

Delete a subscription and its delivery log.

Scope webhooks:manage · returns ok

POST /api/ext/v3/webhooks/{id}/test

Queue a signed test event to this subscription.

Scope webhooks:manage · returns delivery_id