llms.txt for AI assistants) automatically.
Base URL
Authentication
Every request needs your API key as a Bearer token:Conventions
- JSON in, JSON out; property names are snake_case (
duration_seconds,next_cursor). - Timestamps are ISO 8601 / RFC 3339 UTC strings; phone numbers are E.164.
GETendpoints never take request bodies — all filters are query parameters.- Practices your app has not been granted return 404, never 403 — practice IDs cannot be probed.
- Every
POSThonors anIdempotency-Keyheader (24-hour replay window).
Errors
All non-2xx responses share one envelope:error is a stable machine-readable code; message is human-readable and may change — parse the code, not the message.
| Status | Codes |
|---|---|
| 400 | validation_error, invalid_json, invalid_request, invalid_cursor, duplicate_contacts |
| 401 | missing_authorization, invalid_api_key, key_revoked, invalid_token*, token_expired* |
| 403 | app_suspended, insufficient_scope, baa_required |
| 404 | not_found (includes ungranted practices, deliberately) |
| 409 | idempotency_conflict, queue_full, insufficient_minute_balance, limit_exceeded |
| 429 | rate_limited (honor Retry-After), daily_cap_exceeded |
| 500 | internal_error, not_configured |
| 502 | recording_unavailable* |
GET /recordings/stream — the signed-URL target of the GET /calls/{callId}/recording redirect.
Pagination
Pagination varies by resource: Calls (GET /practices/{practiceId}/calls) use cursor pagination — limit (1–100, default 50) and an opaque cursor in, and out:
next_cursor back as cursor for the next page; next_cursor is null on the last page. Treat cursors as opaque and short-lived — don’t store them or construct them.
Call requests (GET /practices/{practiceId}/call-requests) use limit (1–100, default 20) and offset, and return:
GET /practices) and webhook endpoints (GET /webhook-endpoints) return the full set as { "data": [ ... ] } — no pagination.
Rate limits
600 requests/minute per key; bulk writes (call-request creation) have a separate 60/minute budget.429 responses carry Retry-After (seconds).