Reference
Changelog and versioning
What changed in the API, release by release, and what stays stable.
Versioning
- The version is in the path. Every route is under
/v1. - Within
/v1the API only grows. New endpoints, new optional fields, new event types and new error codes can appear in any release. - Ignore what you don't know. Write clients that skip unknown fields and enum values. The SDKs already do.
- Removals are announced. Anything removed or changed incompatibly is listed here, and announced with
DeprecationandSunsetresponse headers at least six months ahead. - Before general availability. Until the first customers are live, breaking changes can still happen. Each one is listed here.
Releases
Each release lists every change to the API, generated by comparing the OpenAPI document before and after it.
Headless platform, phase 2: test mode, request logs, events long-poll · 2026-10-18
- Test mode:
POST /v1/test/inboundsimulates a person writing from a reserved test address (+15550100–+15550199, test-<n>, *@test.vlayers.ai) with avl_test_key. The conversation is stampedtest; every send on it loops back, costs $0 and counts against daily caps. Its events carrylivemode: false. - Four new error codes for test mode:
test_mode_only,test_address_required,test_address_not_allowed,test_limit_reached. - Request logs:
GET /v1/request-logslists the workspace's API requests, newest first (method, route template, status, error code, key, latency, requestId; no bodies; 14-day retention;logs:readscope). - Events:
GET /v1/eventstakeswaitSec(a long-poll of up to 25 s) andfrom=now; both event routes take achannelfilter; the pull'scursoris always set; the events routes' refusals may carrydetails. - Conversation history:
GET /v1/messagesandGET /v1/conversations/{id}/messagestake abeforecursor (before=endfor the newest page) and answerprevCursorfor older pages. - Templates:
content.type: "template"is part of the send schema, but template sends are refused 422operation_not_supported(details.reason: template_sends_not_available) until WhatsApp's template slice ships.GET /v1/channels/whatsapp/templatesreads a WhatsApp Binding's approved-template copy.
Every change (248), by operation
GET /v1/conversations
- Breaking: added the new
test_address_not_allowedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_address_requiredenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_limit_reachedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_mode_onlyenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status503
GET /v1/conversations/{id}
- Breaking: added the new
test_address_not_allowedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_address_requiredenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_limit_reachedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_mode_onlyenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status503
PATCH /v1/conversations/{id}
- Breaking: added the new
test_address_not_allowedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_address_requiredenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_limit_reachedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_mode_onlyenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status503
GET /v1/conversations/{id}/messages
- Breaking: added the new
test_address_not_allowedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_address_requiredenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_limit_reachedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_mode_onlyenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status503 - Change: added the new optional
queryrequest parameterbefore - Change: added the required property
prevCursorto the response with the200status
POST /v1/conversations/{id}/messages
- Breaking: added the new
test_address_not_allowedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_address_requiredenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_limit_reachedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_mode_onlyenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status503 - Change: added
subschema #3to thecontentrequest propertyoneOflist
GET /v1/events
- Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status401 - Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status403 - Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status400 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status401 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status403 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status503 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status400 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status401 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status403 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status503 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status400 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status401 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status403 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status503 - Change: added the new optional
queryrequest parameterchannel - Change: added the new optional
queryrequest parameterfrom - Change: added the new optional
queryrequest parameterwaitSec - Change: added the optional property
detailsto the response with the400status - Change: added the optional property
detailsto the response with the401status - Change: added the optional property
detailsto the response with the403status - Change: added the optional property
detailsto the response with the503status - Change: the response property
cursorbecame not nullable for the status200
GET /v1/events/stream
- Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status401 - Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status403 - Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status410 - Breaking: added the new
cursor_expiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status400 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status401 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status403 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status410 - Breaking: added the new
events_unavailableenum value to theerrorresponse property for the response status503 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status400 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status401 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status403 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status410 - Breaking: added the new
insufficient_scopeenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status410 - Breaking: added the new
invalid_conversation_idenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status410 - Breaking: added the new
invalid_cursorenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status410 - Breaking: added the new
invalid_event_typesenum value to theerrorresponse property for the response status503 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status400 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status401 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status403 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status410 - Breaking: added the new
invalid_requestenum value to theerrorresponse property for the response status503 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status400 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status401 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status403 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status410 - Breaking: added the new
no_projectenum value to theerrorresponse property for the response status503 - Change: added the new optional
queryrequest parameterchannel - Change: added the optional property
detailsto the response with the400status - Change: added the optional property
detailsto the response with the401status - Change: added the optional property
detailsto the response with the403status - Change: added the optional property
detailsto the response with the410status - Change: added the optional property
detailsto the response with the503status
GET /v1/messages
- Breaking: added the new
test_address_not_allowedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_address_requiredenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_limit_reachedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_mode_onlyenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status503 - Change: added the new optional
queryrequest parameterbefore - Change: added the required property
prevCursorto the response with the200status
POST /v1/messages
- Breaking: added the new
test_address_not_allowedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_address_not_allowedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_address_requiredenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_address_requiredenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_limit_reachedenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_limit_reachedenum value to theerrorresponse property for the response status503 - Breaking: added the new
test_mode_onlyenum value to theanyOf[#/components/schemas/MessagingError]/errorresponse property for the response status403 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status400 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status402 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status404 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status409 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status413 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status422 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status429 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status502 - Breaking: added the new
test_mode_onlyenum value to theerrorresponse property for the response status503 - Change: added
subschema #3to thecontentrequest propertyoneOflist
The document
- Change: a breaking change was detected but the version is still
1.0.0
GET /v1/channels/whatsapp/templates
- Change: endpoint added
GET /v1/request-logs
- Change: endpoint added
POST /v1/test/inbound
- Change: endpoint added