Retry provisioning for a failed WhatsApp trunk
Resets a failed trunk to pending and re-runs provisioning
against the existing row — no need to disconnect and reconnect the
WhatsApp account.
This is the recovery path for Meta error 138015 (WhatsApp Calling not yet available for the number until its WhatsApp account clears Meta's messaging-tier and business-verification gate): retry once the account is eligible.
Only a failed trunk is retryable — retrying a pending one would
stomp an in-flight saga, and an active one is already working.
Authorization
bearerAuth Long-lived ES256 JWT minted from the dashboard (https://app.sautikit.com/developers/api-keys). Signed by the
platform keyring. Carries workspace_id and scopes claims;
revoked via the platform deny-list.
In: header
Path Parameters
The tenant NUMBER id.
uuidResponse Body
application/json
application/json
application/json
curl -X POST "https://example.com/v1/numbers/497f6eca-6276-4993-bfeb-53cbbbba6f08/whatsapp/retry"{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "tenant_number_id": "1d93922a-9238-4447-bea9-285b295a748e", "provider": "whatsapp", "external_id": "109876543210987", "status": "pending", "provisioning_step": "string", "provider_config": {}, "readiness": {}, "last_error": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ] }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ] }}Rotate a WhatsApp trunk's SIP credentials POST
Re-mints the trunk's underlying SIP credentials without disconnecting the WhatsApp account or changing the bound `phone_number_id`. Asynchronous — returns **202**; poll `GET`.
Get a number's WhatsApp call settings GET
Returns the settings SautiKit last persisted (`stored`) plus a best-effort LIVE read from Meta (`live`) and any Meta-imposed `restrictions`. The live read is best-effort by design: if it fails, the endpoint still returns `200` with `stored` and puts the reason in `live_error` rather than failing the whole request. Treat `stored` as always present and `live` as a bonus.