List a contact's WhatsApp conversations. The conversations linked to the contact on any of your numbers, newest message first. With WhatsApp off the list is empty.
Parameters
| Name |
In |
Type |
Required |
Description |
id |
path |
string |
Yes |
Contact id. |
limit |
query |
integer |
|
At most this many, 1 to 200 (default 50); larger values are capped. |
Responses
| Code |
Description |
200 |
Success. |
400 |
limit is not a whole number (invalid_request). |
401 |
Missing or invalid API key. |
404 |
Your project has no contact with this id (not_found). |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/contacts/{id}/whatsapp" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppContactConversationList.
GET /v1/integrations/whatsapp/config#
Read the WhatsApp settings of this deployment. Whether WhatsApp is enabled here, whether your plan includes it, the limits every setting is checked against and the default AI disclosure lines. With WhatsApp off the answer is {"enabled": false} and nothing else, and every other WhatsApp route answers 404 whatsapp_unconfigured. Never gated.
Parameters
| Name |
In |
Type |
Required |
Description |
origin |
query |
string |
|
The console origin asking (window.location.origin). allowed_origins is then that origin when Meta's connection window may run on it, and empty when it may not. Without it (and without an Origin header) allowed_origins is the deployment's own console only. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/config" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppConfigView.
GET /v1/integrations/whatsapp/conversations#
List a number's conversations. Newest message first, each with its status. state is evaluated when you read (a status changes with time), over at most five store pages per request: a filtered page may hold fewer than limit items while next_cursor is not empty. No summaries in the list.
**Paging.** Pass next_cursor back as ?cursor=. **An empty next_cursor is the only signal that you have seen everything**; a cursor this listing did not issue answers 400 invalid_cursor.
Parameters
| Name |
In |
Type |
Required |
Description |
number |
query |
string |
|
The number's phone number id. Required when the project has more than one number; with one, it is that one. |
state |
query |
string |
|
all (default) or one status state: agent_answering, agent_waiting, paused, people_only, agent_off, window_closed or not_live. |
limit |
query |
integer |
|
Items per page, 1 to 100 (default 50); larger values are capped. |
cursor |
query |
string |
|
The next_cursor of the previous page. Omit for the first page. |
Responses
| Code |
Description |
200 |
Success. |
400 |
The project has several numbers and number names none (whatsapp_number_required), state is not a state (whatsapp_invalid_state), limit is not a whole number (invalid_request), or the cursor was not issued by this listing (invalid_cursor). |
401 |
Missing or invalid API key. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/conversations" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppConversationPage.
GET /v1/integrations/whatsapp/conversations/{conversation_id}#
Read one conversation. The conversation with its status and the agent's summary of it.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppConversationView.
POST /v1/integrations/whatsapp/conversations/{conversation_id}/claim#
Take a conversation over. A person is handling it: the agent pauses while the claim is open. No body.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
Request body
application/json Schema: WhatsAppEmptyRequest
| Field |
Type |
Required |
Description |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
403 |
This deployment records a named person for every human-oversight action and the request carries none (actor_identity_required): send it through the console. An API key cannot be named, so it is refused while that rule is on. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
409 |
The conversation changed too often while this was applied (whatsapp_conversation_busy); try again. |
413 |
The body is larger than 1 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/claim" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppConversationView.
Download a message's media. The stored file of a message, as an attachment. Its Content-Type is the file's type when that is an image, audio, video, PDF, office or plain-text type, else application/octet-stream; a message's media.download_path names this route while the file is stored.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
media_id |
path |
string |
Yes |
Media id: wm and 16 hex digits, a message's media.id. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. Or the file is not stored: not downloaded, removed by retention, or archived (whatsapp_media_not_found); the message's media.state says which. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/media/{media_id}" \
-H "Authorization: Bearer VL_API_KEY"
GET /v1/integrations/whatsapp/conversations/{conversation_id}/messages#
List a conversation's messages. Newest first, every message kept under your retention, from the customer, the agent, your people and your operations boards.
**Paging.** Pass next_cursor back as ?cursor=. **An empty next_cursor is the only signal that you have seen everything**; a cursor this listing did not issue answers 400 invalid_cursor.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
limit |
query |
integer |
|
Items per page, 1 to 200 (default 50); larger values are capped. |
cursor |
query |
string |
|
The next_cursor of the previous page. Omit for the first page. |
Responses
| Code |
Description |
200 |
Success. |
400 |
limit is not a whole number (invalid_request), or the cursor was not issued by this listing (invalid_cursor). |
401 |
Missing or invalid API key. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/messages" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppMessagePage.
POST /v1/integrations/whatsapp/conversations/{conversation_id}/messages#
Reply in a conversation. Sends a text to the customer as your team, inside the 24-hour window that the customer's last message opened. The reply pauses the agent as the policy's console trigger says. 60 a minute per project. When Meta took the request and gave no answer, the reply may have been sent: 202 with status: unknown, and the message appears in the conversation if Meta confirms it; do not send it again.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
Request body
application/json Schema: WhatsAppReplyRequest
| Field |
Type |
Required |
Description |
rep_name |
string |
|
The name the conversation shows for the reply, at most 80 characters. |
text |
string |
Yes |
1 to 4,096 characters. |
Responses
| Code |
Description |
201 |
Sent. |
202 |
Meta did not confirm the send: it may have been sent. |
400 |
text is blank (whatsapp_text_required) or longer than 4,096 characters (whatsapp_text_too_long), or rep_name is longer than 80 (invalid_request). |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
403 |
This deployment records a named person for every human-oversight action and the request carries none (actor_identity_required): send it through the console. An API key cannot be named, so it is refused while that rule is on. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
409 |
The 24-hour window is closed (whatsapp_window_closed: send a template from an operations board), the number is not live (whatsapp_number_not_live), or its token no longer works (whatsapp_token_invalid). The conversation changed too often while the reply was claimed (whatsapp_conversation_busy, with Retry-After): try again. |
413 |
The body is larger than 20 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
429 |
Too many replies from your project (whatsapp_rate_limited). Meta's own throttling answers the same code with meta_code set. |
4XX |
Request error (validation, not-found, etc.). |
502 |
Meta refused the request (whatsapp_meta_error, with meta_code); Meta's own text is not passed on. |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/messages" \
-H "Authorization: Bearer VL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"rep_name": "Anna",
"text": "Your order ships today."
}'
A successful response returns a WhatsAppReplyView.
POST /v1/integrations/whatsapp/conversations/{conversation_id}/pause#
Pause the agent in a conversation. A hand pause: the agent does not answer here until the duration ends or someone lets it answer again. It replaces any earlier hand action and outlasts the policy's own pauses. quiet_minutes ends once the conversation is quiet that long.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
Request body
application/json Schema: WhatsAppPauseRequest
| Field |
Type |
Required |
Description |
duration |
WhatsAppDuration |
Yes |
How long: minutes, end_of_day, window_end, quiet_minutes or manual. |
Responses
| Code |
Description |
200 |
Success. |
400 |
The duration is not one this action takes, or is out of its bounds (whatsapp_duration_invalid, with details[] naming the bound). |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
403 |
This deployment records a named person for every human-oversight action and the request carries none (actor_identity_required): send it through the console. An API key cannot be named, so it is refused while that rule is on. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
409 |
The conversation changed too often while this was applied (whatsapp_conversation_busy); try again. |
413 |
The body is larger than 1 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/pause" \
-H "Authorization: Bearer VL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"duration": {
"kind": "minutes",
"minutes": 60
}
}'
A successful response returns a WhatsAppConversationView.
POST /v1/integrations/whatsapp/conversations/{conversation_id}/release#
Hand a conversation back. Ends a claim; the policy's console pause runs from now. No body.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
Request body
application/json Schema: WhatsAppEmptyRequest
| Field |
Type |
Required |
Description |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
403 |
This deployment records a named person for every human-oversight action and the request carries none (actor_identity_required): send it through the console. An API key cannot be named, so it is refused while that rule is on. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
409 |
The conversation changed too often while this was applied (whatsapp_conversation_busy); try again. |
413 |
The body is larger than 1 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/release" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppConversationView.
POST /v1/integrations/whatsapp/conversations/{conversation_id}/resume#
Let the agent answer in a conversation again. Ends a pause. With hold, the agent keeps answering here until the hold ends, whatever the policy's pauses say; without one, the policy decides from here.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
Request body
application/json Schema: WhatsAppResumeRequest
| Field |
Type |
Required |
Description |
hold |
WhatsAppDuration |
|
Keep the agent answering until then: minutes, end_of_day, window_end or manual. |
Responses
| Code |
Description |
200 |
Success. |
400 |
The duration is not one this action takes, or is out of its bounds (whatsapp_duration_invalid, with details[] naming the bound). |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
403 |
This deployment records a named person for every human-oversight action and the request carries none (actor_identity_required): send it through the console. An API key cannot be named, so it is refused while that rule is on. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
409 |
The conversation changed too often while this was applied (whatsapp_conversation_busy); try again. |
413 |
The body is larger than 1 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/resume" \
-H "Authorization: Bearer VL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"hold": {
"kind": "end_of_day"
}
}'
A successful response returns a WhatsAppConversationView.
DELETE /v1/integrations/whatsapp/conversations/{conversation_id}/summary#
Forget the agent's summary of a conversation. The agent starts its next session here without the summary of the earlier ones. Never gated.
Parameters
| Name |
In |
Type |
Required |
Description |
conversation_id |
path |
string |
Yes |
Conversation id: wc and 16 letters or digits. |
Responses
| Code |
Description |
204 |
Forgotten; the messages stay. |
401 |
Missing or invalid API key. |
404 |
Your project has no conversation with this id (whatsapp_conversation_not_found), or it is being erased. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X DELETE "https://api.voiceland.ai/v1/integrations/whatsapp/conversations/{conversation_id}/summary" \
-H "Authorization: Bearer VL_API_KEY"
GET /v1/integrations/whatsapp/numbers#
List your connected numbers. Every number connected to this project, oldest connection first; not paged (a project has a few). Never a token: token says only when it expires and whether it still works. Numbers are connected in the console, through Meta's connection window; the API has no connect route.
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/numbers" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppNumberList.
DELETE /v1/integrations/whatsapp/numbers/{phone_number_id}#
Disconnect a number. Stops routing at once and ends the number's live sessions. The conversations stay under their retention. When this was the WhatsApp account's last number here, the account's subscription and its token are released too; unsubscribed and token_deleted say whether that finished already. Never gated: a project whose plan changed can still remove what it has.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X DELETE "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppDisconnectView.
GET /v1/integrations/whatsapp/numbers/{phone_number_id}#
Read one number. The number with the operations boards whose WhatsApp trigger listens to it (boards).
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppNumberView.
PATCH /v1/integrations/whatsapp/numbers/{phone_number_id}#
Change a number's settings. Every key is optional and only the keys you send change; memory and disclosure_line are whole blocks. Send version (the number's) to refuse the change if someone else changed the number since you read it. Changing agent ends the conversation's live session, and "" leaves the number to your people. Under the pseudonymize_at_rest transcript policy a summary switched on is stored and reported off (pseudonymized: true).
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Request body
application/json Schema: WhatsAppNumberPatch
| Field |
Type |
Required |
Description |
agent |
string |
|
|
create_contact_on_first_message |
boolean |
|
|
disclosure_line |
WhatsAppLinePatch |
|
|
memory |
WhatsAppMemoryPatch |
|
|
notify_emails |
array of string |
|
|
timezone |
string |
|
|
version |
integer |
|
|
Responses
| Code |
Description |
200 |
Success. |
400 |
A setting is out of bounds (whatsapp_invalid_settings, with details[]), or agent names no agent of the project (whatsapp_agent_not_found). |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
403 |
Only your provider (Voiceland) switches the AI disclosure line off (operator_only_field); its texts stay editable. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
409 |
version is not the number's version (whatsapp_version_conflict): read it again. |
413 |
The body is larger than 16 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X PATCH "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}" \
-H "Authorization: Bearer VL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent": "reception",
"memory": {
"idle_close_min": 15,
"lookback_days": 90,
"recent_messages": 20,
"summary_enabled": true
},
"notify_emails": [
"ops@acme.example"
],
"timezone": "Europe/Athens",
"version": 12
}'
A successful response returns a WhatsAppNumberView.
GET /v1/integrations/whatsapp/numbers/{phone_number_id}/answer-policy#
Read the number's answer policy. Who answers when: the policy, its version, the limits, the presets built for this number (business hours pre-filled from your project's) and the stored policy's week in the number's time zone.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}/answer-policy" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppPolicyView.
PUT /v1/integrations/whatsapp/numbers/{phone_number_id}/answer-policy#
Replace the number's answer policy. Replaces the whole policy. version is the version your edit was based on: a stale one is refused and nothing changes. The read-only keys of the read are accepted and ignored, so the answer of the read is a valid body. A change applies from the next customer message; a conversation already waiting keeps the version it started under.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Request body
application/json Schema: WhatsAppPolicyPut
| Field |
Type |
Required |
Description |
policy |
WhatsAppAnswerPolicy |
Yes |
Who answers a number's WhatsApp messages, and when. |
version |
integer |
Yes |
The version this edit was based on. |
Responses
| Code |
Description |
200 |
Success. |
400 |
The policy is not valid (whatsapp_policy_invalid, with details[] naming each field and its bound), or version is missing (whatsapp_policy_version_required). |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
409 |
Someone changed the policy since your version (whatsapp_policy_conflict, with current_version). |
413 |
The body is larger than 64 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X PUT "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}/answer-policy" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppPolicyView.
POST /v1/integrations/whatsapp/numbers/{phone_number_id}/answer-policy/preview#
Preview a policy's week. The week a policy would make in the number's time zone, with the windows now and the next changes. Writes nothing; never gated.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Request body
application/json Schema: WhatsAppPolicyPreviewRequest
| Field |
Type |
Required |
Description |
policy |
WhatsAppAnswerPolicy |
Yes |
Who answers a number's WhatsApp messages, and when. |
Responses
| Code |
Description |
200 |
Success. |
400 |
The policy is not valid (whatsapp_policy_invalid, with details[]). |
401 |
Missing or invalid API key. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
413 |
The body is larger than 64 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}/answer-policy/preview" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppWeekPreview.
POST /v1/integrations/whatsapp/numbers/{phone_number_id}/health#
Re-check a number now. Reads the number's health, its details and its token from Meta again, and moves it back to live when Meta cleared what blocked it. Once per 30 seconds per number. No body.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
409 |
The number's token no longer works (whatsapp_token_invalid): reconnect the number in the console. |
413 |
The body is larger than 1 KiB (body_too_large). |
429 |
This number was re-checked less than 30 seconds ago (whatsapp_rate_limited). Meta's own throttling answers the same code with meta_code set. |
4XX |
Request error (validation, not-found, etc.). |
502 |
Meta refused the request (whatsapp_meta_error, with meta_code); Meta's own text is not passed on. |
503 |
The tenant secret vault could not be read right now (whatsapp_vault_unavailable); try again later. |
504 |
Meta did not answer in time (whatsapp_meta_timeout); retry. |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}/health" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppNumberView.
POST /v1/integrations/whatsapp/numbers/{phone_number_id}/switch#
Start or cancel moving a number off the WhatsApp Business app. For a number kept in the WhatsApp Business app: start marks the move to the Cloud API as begun (state: switching), which finishes when the number is connected again in the console; cancel undoes it.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Request body
application/json Schema: WhatsAppSwitchRequest
| Field |
Type |
Required |
Description |
action |
string |
Yes |
start or cancel. |
Responses
| Code |
Description |
200 |
Success. |
400 |
action is not start or cancel (invalid_request). |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
409 |
The number is not kept in the WhatsApp Business app, or is not live, limited or disconnected (whatsapp_switch_not_allowed). |
413 |
The body is larger than 1 KiB (body_too_large). |
422 |
The body is JSON this route cannot read (invalid_request): a field the document does not have, at any depth, a value of the wrong type, or more than one JSON value. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}/switch" \
-H "Authorization: Bearer VL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "start"
}'
A successful response returns a WhatsAppNumberView.
GET /v1/integrations/whatsapp/numbers/{phone_number_id}/templates#
List the number's message templates. The templates of the number's WhatsApp account as last synced (templates belong to the account and are shared by its numbers), by name then language. Templates are made and approved in WhatsApp Manager.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
status |
query |
string |
|
Only templates in this status, such as APPROVED, PENDING or REJECTED. |
Responses
| Code |
Description |
200 |
Success. |
400 |
status is not an upper-case status (invalid_request). |
401 |
Missing or invalid API key. |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
4XX |
Request error (validation, not-found, etc.). |
5XX |
Server or upstream error. |
Example request
curl "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}/templates" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppTemplateList.
POST /v1/integrations/whatsapp/numbers/{phone_number_id}/templates/refresh#
Sync the number's templates from Meta now. Reads every template from Meta and answers the synced list. 6 times an hour per WhatsApp account. No body.
Parameters
| Name |
In |
Type |
Required |
Description |
phone_number_id |
path |
string |
Yes |
Meta's phone number id of one of your connected numbers. |
Responses
| Code |
Description |
200 |
Success. |
401 |
Missing or invalid API key. |
402 |
Your plan does not include WhatsApp (feature_not_entitled, with missing_features: ["whatsapp_channel"]), or the project has no plan (no_subscription). Nothing was changed. |
403 |
Meta has not granted this app access to the account yet (whatsapp_meta_permission_denied, with meta_code). |
404 |
Your project has no connected number with this id (whatsapp_number_not_found); an id of the wrong shape answers the same. |
409 |
The WhatsApp account's token no longer works (whatsapp_token_invalid): reconnect the number in the console. |
413 |
The body is larger than 1 KiB (body_too_large). |
429 |
The templates of this WhatsApp account were synced too often (whatsapp_rate_limited). Meta's own throttling answers the same code with meta_code set. |
4XX |
Request error (validation, not-found, etc.). |
502 |
Meta refused the request (whatsapp_meta_error, with meta_code); Meta's own text is not passed on. |
503 |
The tenant secret vault could not be read right now (whatsapp_vault_unavailable); try again later. |
504 |
Meta did not answer in time (whatsapp_meta_timeout); retry. |
5XX |
Server or upstream error. |
Example request
curl -X POST "https://api.voiceland.ai/v1/integrations/whatsapp/numbers/{phone_number_id}/templates/refresh" \
-H "Authorization: Bearer VL_API_KEY"
A successful response returns a WhatsAppTemplateList.
Schemas#
Error#
Error envelope returned for non-2xx responses.
| Field |
Type |
Required |
Description |
error |
object |
Yes |
|
WhatsAppAnswerPolicy#
Who answers a number's WhatsApp messages, and when.
| Field |
Type |
Required |
Description |
closed_days |
array of string |
Yes |
Dates (YYYY-MM-DD, the number's time zone) the default window covers. |
preset |
string |
Yes |
The preset that last filled the form: agent_all, team_first_5m, agent_outside_hours, people_only or custom. Informational. |
reentry_line |
WhatsAppPolicyLine |
Yes |
A line sent before the agent's first reply after a pause. |
windows |
array of WhatsAppPolicyWindow |
Yes |
The windows in precedence order: business hours, custom windows, and last the one default window. |
WhatsAppBoardRef#
| Field |
Type |
Required |
Description |
name |
string |
Yes |
|
trigger |
string |
Yes |
trigger.whatsapp_message or trigger.whatsapp_team_reply. |
WhatsAppBound#
| Field |
Type |
Required |
Description |
max |
integer |
Yes |
|
min |
integer |
Yes |
|
step |
integer |
Yes |
|
WhatsAppBoundsView#
| Field |
Type |
Required |
Description |
agent_delay_s |
WhatsAppBound |
Yes |
A window's agent delay, in seconds. |
closed_days_max |
integer |
Yes |
Closed days per policy. |
custom_windows_max |
integer |
Yes |
Custom windows per policy. |
idle_close_min |
WhatsAppBound |
Yes |
Minutes of silence after which a session ends. |
line_chars_max |
integer |
Yes |
Characters of one line (the disclosure line, the re-entry line). |
line_languages_max |
integer |
Yes |
Languages of one line. |
lookback_days |
WhatsAppBound |
Yes |
How far back the agent reads; the maximum is this deployment's conversation retention. |
notify_emails_max |
integer |
Yes |
Addresses a number notifies. |
pause_minutes |
WhatsAppBound |
Yes |
A pause of minutes. |
quiet_minutes |
WhatsAppBound |
Yes |
A pause that ends once the conversation is quiet this long. |
quiet_reentry_hours |
WhatsAppBound |
Yes |
The quiet re-entry: hours without messages. |
ranges_per_day_max |
integer |
Yes |
Time ranges per day of a window. |
recent_messages |
WhatsAppBound |
Yes |
How many recent messages the agent reads at the start of a session. |
reply_chars_max |
integer |
Yes |
The longest staff reply, in characters. |
team_silence_minutes |
WhatsAppBound |
Yes |
The team-silence re-entry: minutes after a person's last message. |
team_wait_s |
WhatsAppBound |
Yes |
A window's wait for the team before the agent answers, in seconds; null in a policy is never. |
window_name_max |
integer |
Yes |
Characters of a window's name. |
WhatsAppClaim#
| Field |
Type |
Required |
Description |
at |
string (date-time) |
Yes |
|
by |
string |
Yes |
|
WhatsAppClosedDay#
| Field |
Type |
Required |
Description |
date |
string |
Yes |
|
window_id |
string |
Yes |
|
WhatsAppCoexView#
| Field |
Type |
Required |
Description |
disconnect_by |
string |
|
|
disconnect_reason |
string |
|
|
disconnected_at |
string (date-time) |
|
|
last_app_activity_at |
string (date-time) |
|
|
reminder_sent_at |
string (date-time) |
|
|
switch_started_at |
string (date-time) |
|
|
WhatsAppConfigView#
WhatsApp on this deployment. With WhatsApp off the answer is {"enabled": false} and nothing else.
| Field |
Type |
Required |
Description |
allowed_origins |
array of string |
|
The caller's console origin when Meta's connection window may run on it (see origin), else empty; with no origin named, the deployment's own console. Never the whole list. |
app_id |
string |
|
The Meta app the console's connection window runs with. |
bounds |
WhatsAppBoundsView |
|
Every limit the settings and the answer policy are checked against. |
coexistence |
boolean |
|
true when a number may stay in the WhatsApp Business app while the agent answers beside it. |
config_id |
string |
|
The connection window's configuration at Meta. |
connect_extras |
map of object |
|
Per connection mode, the extras the console passes to Meta's connection window. |
default_lines |
WhatsAppDefaultLines |
|
The default lines for a language a number has not stored. |
early_access |
boolean |
|
Always false: WhatsApp is generally available. Kept for clients that read it. |
enabled |
boolean |
Yes |
true when WhatsApp is enabled on this deployment. |
entitled |
boolean |
|
true when your plan includes WhatsApp (whatsapp_channel). |
graph_version |
string |
|
The Meta Graph API version this deployment calls. |
link_ttl_s |
integer |
|
How long a pause or resume link in a notice works, in seconds. |
manager_url |
string |
|
WhatsApp Manager, where templates and payment are managed. |
sdk_url |
string |
|
Meta's JavaScript SDK the console loads for the connection window. |
| Field |
Type |
Required |
Description |
conversation_id |
string |
Yes |
|
has_imported_history |
boolean |
Yes |
true when the conversation came with history from the WhatsApp Business app. |
last_inbound_at |
string (date-time) |
|
|
last_message_at |
string (date-time) |
|
|
number |
string |
Yes |
The business number, E.164. |
number_id |
string |
Yes |
|
number_name |
string |
|
The business number's verified name. |
phone |
string |
|
|
profile_name |
string |
|
|
user_id |
string |
|
|
window_open_until |
string (date-time) |
|
|
WhatsAppConversationPage#
WhatsAppConversationView#
| Field |
Type |
Required |
Description |
contact_id |
string |
Yes |
The linked contact; empty when none. |
customer |
WhatsAppCustomerView |
Yes |
The customer as WhatsApp names them. |
id |
string |
Yes |
|
imported |
boolean |
Yes |
|
last_inbound_at |
string (date-time) |
|
|
last_message_at |
string (date-time) |
|
|
last_message_preview |
string |
Yes |
The first 120 characters of the newest message, as stored. |
number |
string |
Yes |
The number's phone_number_id. |
origin |
string |
Yes |
Empty, import (from the WhatsApp Business app's history) or team (started from the app). |
session_open |
boolean |
Yes |
true while the agent has a session open here. |
status |
WhatsAppStatus |
Yes |
Who answers now, and until when. |
summary |
string |
|
The single read only: the agent's summary of earlier sessions. |
summary_at |
string (date-time) |
|
|
unanswered_since |
string (date-time) |
|
The oldest customer message nobody answered yet. |
window_open_until |
string (date-time) |
|
When the 24-hour window the customer's last message opened closes. |
WhatsAppCustomerView#
| Field |
Type |
Required |
Description |
phone |
string |
|
E.164, absent for a customer known by user id only. |
profile_name |
string |
|
|
user_id |
string |
|
WhatsApp's user id of the customer. |
username |
string |
|
|
WhatsAppDefaultLines#
| Field |
Type |
Required |
Description |
disclosure |
map of string |
Yes |
The default AI disclosure line per language; {business} stands for the number's verified name. |
WhatsAppDisconnectView#
| Field |
Type |
Required |
Description |
phone_number_id |
string |
Yes |
|
token_deleted |
boolean |
Yes |
true when the account's token was deleted with it. |
unsubscribed |
boolean |
Yes |
true when this was the WhatsApp account's last number here and Meta confirmed the release. |
WhatsAppDuration#
| Field |
Type |
Required |
Description |
kind |
string |
Yes |
minutes, end_of_day, window_end, quiet_minutes, manual (until someone acts) or, on the hand-over trigger only, until_team_reply. |
minutes |
integer |
|
With minutes (1 to 10080) and quiet_minutes (5 to 10080) only. |
WhatsAppEmptyRequest#
| Field |
Type |
Required |
Description |
WhatsAppHealthError#
| Field |
Type |
Required |
Description |
entity_type |
string |
Yes |
|
error_code |
integer |
Yes |
|
error_description |
string |
Yes |
|
possible_solution |
string |
Yes |
|
WhatsAppHealthView#
| Field |
Type |
Required |
Description |
additional_info |
array of string |
Yes |
|
can_send_message |
string |
Yes |
AVAILABLE, LIMITED, BLOCKED, or empty before the first read. |
checked_at |
string (date-time) |
|
When the health was read. |
errors |
array of WhatsAppHealthError |
Yes |
Meta's reasons when the number cannot send freely. |
payment_blocked_at |
string (date-time) |
|
When Meta refused a send for a missing payment method. |
WhatsAppImportView#
| Field |
Type |
Required |
Description |
contacts_choice |
string |
Yes |
|
contacts_imported |
integer |
Yes |
|
contacts_matched |
integer |
Yes |
|
contacts_state |
string |
Yes |
|
deadline_at |
string (date-time) |
|
|
failure_code |
string |
|
|
finished_at |
string (date-time) |
|
|
history_choice |
string |
Yes |
|
history_state |
string |
Yes |
|
messages_imported |
integer |
Yes |
|
messages_skipped |
integer |
Yes |
|
onboarded_at |
string (date-time) |
|
|
phase |
integer |
Yes |
|
progress |
integer |
Yes |
|
state |
string |
Yes |
|
WhatsAppLinePatch#
| Field |
Type |
Required |
Description |
enabled |
boolean |
Yes |
Only your provider (Voiceland) switches the AI disclosure line off. |
texts |
map of string |
|
The line per BCP-47 language (at most 12), 1 to 300 characters each. |
WhatsAppLinesView#
| Field |
Type |
Required |
Description |
enabled |
boolean |
Yes |
true when the line is sent. |
texts |
map of string |
Yes |
The line per BCP-47 language, at most 300 characters each. |
WhatsAppLocation#
| Field |
Type |
Required |
Description |
address |
string |
|
|
latitude |
number |
Yes |
|
longitude |
number |
Yes |
|
name |
string |
|
|
| Field |
Type |
Required |
Description |
download_path |
string |
|
The media route, relative to the API base; present while the file is stored. |
filename |
string |
Yes |
|
id |
string |
Yes |
|
kind |
string |
Yes |
|
mime_type |
string |
Yes |
The type the sender gave; the download is served as a safe type. |
size |
integer |
Yes |
|
state |
string |
Yes |
not_stored, stored, too_large, failed, purged (removed by retention) or archived. |
transcript |
string |
Yes |
A voice note's transcript, when there is one. |
WhatsAppMemoryPatch#
| Field |
Type |
Required |
Description |
idle_close_min |
integer |
Yes |
|
lookback_days |
integer |
Yes |
|
recent_messages |
integer |
Yes |
|
summary_enabled |
boolean |
|
Leave it out to keep the stored value. |
WhatsAppMemoryView#
| Field |
Type |
Required |
Description |
idle_close_min |
integer |
Yes |
Minutes of silence after which a session ends (1 to 60). |
lookback_days |
integer |
Yes |
How far back the agent reads (1 to retention_days). |
recent_messages |
integer |
Yes |
Recent messages the agent reads at the start of a session (0 to 60). |
summary_enabled |
boolean |
Yes |
true when the agent keeps a summary of earlier sessions; reported false under pseudonymisation. |
WhatsAppMessagePage#
WhatsAppMessageView#
| Field |
Type |
Required |
Description |
at |
string (date-time) |
Yes |
|
caption |
string |
Yes |
|
contacts |
array of WhatsAppSharedContact |
Yes |
|
direction |
string |
Yes |
inbound or outbound. |
error_code |
integer |
Yes |
Meta's error code of a failed message. |
id |
string |
Yes |
The message's id: Meta's wamid. |
location |
WhatsAppLocation |
|
|
media |
WhatsAppMediaView |
|
|
reaction |
WhatsAppReaction |
|
|
rep |
string |
Yes |
The person who wrote a console reply. |
rep_name |
string |
Yes |
|
sender |
string |
Yes |
customer, agent, team or automation (an operations board). |
session_id |
string |
Yes |
|
source |
string |
Yes |
A team or imported message: app, console, api or import. |
status |
string |
Yes |
received, rate_limited, expired, accepted, sent, delivered, read, played or failed. |
template |
WhatsAppTemplateRef |
|
|
text |
string |
Yes |
|
type |
string |
Yes |
|
wamid |
string |
Yes |
|
WhatsAppNumberList#
WhatsAppNumberPatch#
| Field |
Type |
Required |
Description |
agent |
string |
|
|
create_contact_on_first_message |
boolean |
|
|
disclosure_line |
WhatsAppLinePatch |
|
|
memory |
WhatsAppMemoryPatch |
|
|
notify_emails |
array of string |
|
|
timezone |
string |
|
|
version |
integer |
|
|
WhatsAppNumberView#
A connected WhatsApp number. Never a token, PIN or anything that configures one.
| Field |
Type |
Required |
Description |
agent |
string |
Yes |
The agent that answers; empty: your people only. |
agent_languages |
array of string |
Yes |
The agent's languages, the keys of the per-language lines. |
agent_missing |
boolean |
Yes |
true when the agent was deleted: nobody answers until another is chosen. |
boards |
array of WhatsAppBoardRef |
|
The single read only: operations boards whose WhatsApp trigger listens to this number. |
business_id |
string |
Yes |
|
coex |
WhatsAppCoexView |
|
A number kept in the WhatsApp Business app: its activity and the move off it. |
connected_at |
string (date-time) |
|
|
create_contact_on_first_message |
boolean |
Yes |
true when a customer's first message creates a contact if none matches. |
demo |
boolean |
Yes |
true for a Voiceland demo number. |
disclosure_line |
WhatsAppLinesView |
Yes |
The AI disclosure line sent before the agent's first reply and again after a person replied. |
display_phone_number |
string |
Yes |
The number as Meta displays it. |
entitled |
boolean |
Yes |
false when your plan no longer includes WhatsApp: the data stays and nothing is answered. |
health |
WhatsAppHealthView |
Yes |
Meta's health of the number as last read. |
import |
WhatsAppImportView |
|
A number kept in the WhatsApp Business app: the history and contacts import. |
last_webhook_at |
string (date-time) |
|
When Meta last delivered something for the number (updated at most every five minutes). |
memory |
WhatsAppMemoryView |
Yes |
What the agent remembers between sessions. |
messaging_limit |
string |
Yes |
Meta's messaging limit tier, such as TIER_250. |
meta_status |
string |
Yes |
|
mode |
string |
Yes |
cloud_api, or coexistence for a number kept in the WhatsApp Business app. |
name_status |
string |
Yes |
|
notify_emails |
array of string |
Yes |
Who is told when the number needs attention; empty: the account's owner contact, or up to three of its administrators when there is none. |
ownership_type |
string |
Yes |
|
phone_number_id |
string |
Yes |
Meta's id of the number: the routes' phone_number_id. |
policy_summary |
WhatsAppPolicySummary |
Yes |
The answer policy in one line. |
pseudonymized |
boolean |
Yes |
true under the pseudonymize_at_rest transcript policy: messages are stored pseudonymised and summaries are off. |
quality_rating |
string |
Yes |
|
retention_days |
integer |
Yes |
The longest memory lookback: this deployment's conversation retention. |
state |
string |
Yes |
live, limited, checking (health not read yet), blocked, payment_required (Meta refuses sends until a payment method is added), reconnect_required (the token expired or was revoked: connect again in the console), connected_elsewhere, switching, disconnected, connecting or disconnecting. |
state_reason |
string |
Yes |
Why the number needs a person: Meta's disconnection reason (such as PRIMARY_INACTIVITY), token_expired, token_revoked, token_invalid, payment or unknown; empty otherwise. |
timezone |
string |
Yes |
The answer policy's clock (IANA). |
token |
WhatsAppTokenView |
Yes |
The business token's life; never the token. |
verified_name |
string |
Yes |
The business name Meta approved for the number. |
version |
integer |
Yes |
The number's version; send it back on a PATCH to refuse a change someone else made first. |
waba_id |
string |
Yes |
The WhatsApp Business Account the number belongs to; its templates are the account's. |
WhatsAppOverride#
| Field |
Type |
Required |
Description |
at |
string (date-time) |
Yes |
|
by |
string |
Yes |
|
kind |
string |
Yes |
|
mode |
string |
Yes |
|
until |
string (date-time) |
|
|
via |
string |
Yes |
console, api or link. |
WhatsAppPauseRequest#
| Field |
Type |
Required |
Description |
duration |
WhatsAppDuration |
Yes |
How long: minutes, end_of_day, window_end, quiet_minutes or manual. |
WhatsAppPauseTrigger#
| Field |
Type |
Required |
Description |
duration |
WhatsAppDuration |
Yes |
|
enabled |
boolean |
Yes |
|
WhatsAppPauseTriggers#
WhatsAppPolicyLine#
| Field |
Type |
Required |
Description |
enabled |
boolean |
Yes |
|
texts |
map of string |
Yes |
The line per BCP-47 language, at most 300 characters each. |
WhatsAppPolicyPreviewRequest#
| Field |
Type |
Required |
Description |
policy |
WhatsAppAnswerPolicy |
Yes |
Who answers a number's WhatsApp messages, and when. |
WhatsAppPolicyPut#
| Field |
Type |
Required |
Description |
policy |
WhatsAppAnswerPolicy |
Yes |
Who answers a number's WhatsApp messages, and when. |
version |
integer |
Yes |
The version this edit was based on. |
WhatsAppPolicySummary#
| Field |
Type |
Required |
Description |
preset |
string |
Yes |
The preset that last filled the policy, or custom. |
version |
integer |
Yes |
The policy's version. |
windows |
integer |
Yes |
How many windows the policy has. |
WhatsAppPolicyView#
| Field |
Type |
Required |
Description |
bounds |
WhatsAppBoundsView |
Yes |
|
default_preset |
string |
Yes |
The preset a new number of this mode starts with. |
phone_number_id |
string |
Yes |
|
policy |
WhatsAppAnswerPolicy |
|
Who answers a number's WhatsApp messages, and when. |
presets |
map of WhatsAppAnswerPolicy |
Yes |
The presets built for this number: agent_all, team_first_5m, agent_outside_hours and people_only. |
timezone |
string |
Yes |
The number's time zone: the policy's clock. |
updated_at |
string (date-time) |
|
|
updated_by |
string |
|
Who saved the policy last. |
version |
integer |
Yes |
The policy's version; send it with the PUT. |
week |
WhatsAppWeekPreview |
|
The stored policy's week in the number's time zone. |
WhatsAppPolicyWindow#
| Field |
Type |
Required |
Description |
agent_delay_s |
integer |
Yes |
When the agent answers first: seconds it waits (0 to 600, step 10). |
agent_enabled |
boolean |
Yes |
false: people only in this window. |
answer_scope |
string |
Yes |
all_unanswered or latest. |
first_responder |
string |
Yes |
agent or team. |
id |
string |
Yes |
business_hours, default, or c and 1 to 15 letters or digits for a custom window. |
kind |
string |
Yes |
business_hours, custom or default. |
name |
string |
Yes |
|
pause_triggers |
WhatsAppPauseTriggers |
Yes |
|
reentry |
WhatsAppReentryRules |
Yes |
|
schedule |
WhatsAppSchedule |
|
When the window applies; the default window has none. |
team_wait_s |
integer |
|
When the team answers first: seconds before the agent answers (60 to 86400, step 60); null: never. |
WhatsAppReaction#
| Field |
Type |
Required |
Description |
emoji |
string |
|
|
message_id |
string |
Yes |
|
WhatsAppReentry#
| Field |
Type |
Required |
Description |
answer_pending |
boolean |
Yes |
|
at |
string (date-time) |
|
|
minutes |
integer |
|
|
rule |
string |
Yes |
What brings the agent back first: pause_end, team_silence, window_change, quiet or manual. |
WhatsAppReentryHours#
| Field |
Type |
Required |
Description |
enabled |
boolean |
Yes |
|
hours |
integer |
Yes |
|
WhatsAppReentryMinutes#
| Field |
Type |
Required |
Description |
enabled |
boolean |
Yes |
|
minutes |
integer |
Yes |
|
WhatsAppReentryPauseEnd#
| Field |
Type |
Required |
Description |
answer_pending |
boolean |
Yes |
|
enabled |
boolean |
Yes |
|
WhatsAppReentryRules#
WhatsAppReplyRequest#
| Field |
Type |
Required |
Description |
rep_name |
string |
|
The name the conversation shows for the reply, at most 80 characters. |
text |
string |
Yes |
1 to 4,096 characters. |
WhatsAppReplyView#
WhatsAppResumeRequest#
| Field |
Type |
Required |
Description |
hold |
WhatsAppDuration |
|
Keep the agent answering until then: minutes, end_of_day, window_end or manual. |
WhatsAppSchedule#
WhatsAppScheduleDay#
WhatsAppScheduleRange#
| Field |
Type |
Required |
Description |
end |
string |
Yes |
|
start |
string |
Yes |
|
| Field |
Type |
Required |
Description |
emails |
array of string |
|
|
name |
string |
Yes |
|
org |
string |
|
|
phones |
array of string |
|
|
WhatsAppStatus#
| Field |
Type |
Required |
Description |
chip |
WhatsAppStatusChip |
Yes |
|
claim |
WhatsAppClaim |
|
|
hand_seq |
integer |
Yes |
|
override |
WhatsAppOverride |
|
|
policy_version |
integer |
Yes |
|
quiet_minutes |
integer |
|
|
reason |
string |
Yes |
|
reentry |
WhatsAppReentry |
|
|
state |
string |
Yes |
|
unanswered |
integer |
Yes |
|
until |
string (date-time) |
|
|
until_kind |
string |
|
|
waiting_for |
string |
|
|
window |
string |
Yes |
|
window_id |
string |
Yes |
|
window_mode |
string |
Yes |
|
window_open_until |
string (date-time) |
|
|
WhatsAppStatusChip#
| Field |
Type |
Required |
Description |
key |
string |
Yes |
|
params |
map of string |
Yes |
|
tone |
string |
Yes |
|
WhatsAppSwitchRequest#
| Field |
Type |
Required |
Description |
action |
string |
Yes |
start or cancel. |
WhatsAppTemplateList#
| Field |
Type |
Required |
Description |
items |
array of WhatsAppTemplateView |
Yes |
|
synced_at |
string (date-time) |
|
When the templates were last synced from Meta. |
truncated |
boolean |
Yes |
true when the account has more than 2,000 templates: filter by status. |
WhatsAppTemplateRef#
| Field |
Type |
Required |
Description |
language |
string |
Yes |
|
name |
string |
Yes |
|
WhatsAppTemplateView#
| Field |
Type |
Required |
Description |
body_params |
integer |
Yes |
|
body_text |
string |
Yes |
|
category |
string |
Yes |
|
header_format |
string |
Yes |
NONE, TEXT, IMAGE, VIDEO, DOCUMENT or LOCATION. |
id |
string |
Yes |
|
language |
string |
Yes |
|
last_synced_at |
string (date-time) |
|
|
name |
string |
Yes |
|
named_params |
array of string |
Yes |
|
parameter_format |
string |
Yes |
POSITIONAL or NAMED. |
quality |
string |
Yes |
|
rejected_reason |
string |
Yes |
|
status |
string |
Yes |
Meta's status, such as APPROVED, PENDING, REJECTED or PAUSED. |
unsupported |
string |
Yes |
Why an operations board cannot send this template; empty when it can. |
variables |
array of string |
Yes |
The values a send fills, in order. |
waba_id |
string |
Yes |
|
WhatsAppToggle#
| Field |
Type |
Required |
Description |
enabled |
boolean |
Yes |
|
WhatsAppTokenView#
| Field |
Type |
Required |
Description |
expires_at |
string (date-time) |
|
When the business token expires; absent when it does not. |
expiring |
boolean |
Yes |
true within 7 days of the expiry: connect again in the console. |
invalid |
boolean |
Yes |
true when the token no longer works: connect again in the console. |
WhatsAppWeekChange#
| Field |
Type |
Required |
Description |
at |
string (date-time) |
Yes |
|
mode |
string |
Yes |
|
window_id |
string |
Yes |
|
WhatsAppWeekDay#
WhatsAppWeekNow#
| Field |
Type |
Required |
Description |
local_time |
string |
Yes |
|
mode |
string |
Yes |
|
until |
string (date-time) |
|
|
window_id |
string |
Yes |
|
WhatsAppWeekPreview#
A policy's week in the number's time zone.
WhatsAppWeekSegment#
| Field |
Type |
Required |
Description |
agent_delay_s |
integer |
Yes |
|
end |
string |
Yes |
|
mode |
string |
Yes |
agent, team_then_agent, team_only or agent_off. |
start |
string |
Yes |
|
team_wait_s |
integer |
|
|
window_id |
string |
Yes |
|
window_kind |
string |
Yes |
|
window_name |
string |
Yes |
|