Error envelope
Business endpoint handlers return the following envelope. Validation example:details varies by error and may be absent. Keep request_id, endpoint, HTTP
status and time for support, without tokens or unnecessary customer data. Errors
before the handler, including 429, may have another format and no
request_id. Inspect HTTP status before parsing the JSON envelope.
A negative exact-slot check returns
200 with data.available: false. An
unbookable slot at creation returns 422, not 409. A missed-call report
processed with 201 and a SKIPPED_* outcome is not an error.
Rate limits and retries
The partner route rule is configured for 600 requests per minute per client IP, not a per-key quota. When present, headers arex-ratelimit-limit,
x-ratelimit-remaining and x-ratelimit-reset; reset is a Unix timestamp in
milliseconds. These headers are not guaranteed on every response. On 429,
reduce the request rate and back off before retrying.
Do not blindly repeat a write after a timeout or server error: it may already
have been stored. For reservations, search by external_id as described in the
booking flow. For missed calls, reuse
external_call_id and inspect the endpoint’s outcome semantics. Webhook
timeouts and retries have a
separate contract.
For a failed missed call, an already stored row can make a retry with the same
external_call_id return SKIPPED_DUPLICATE without retrying WhatsApp
dispatch. Contact support to check that failure; do not change the identifier to
force a new send. SENT means the WhatsApp task was scheduled, not that the
customer received the message.