Call Analytics API documentation

Errors

The API uses conventional HTTP status codes and a consistent JSON error envelope so you can branch on the machine-readable error code.

Error envelope

Errors return a JSON body with an error code and usually a human-readable message. Validation errors add an errors map keyed by field.

{
  "error": "unauthorized",
  "message": "Invalid, expired, or revoked API key."
}
{
  "error": "validation_failed",
  "errors": { "recording_url": ["must be a valid URL"] }
}

Always branch on the error code, not the message text โ€” messages may be reworded.

Status codes

StatusMeaningWhen it happens
200OKSuccessful read; also a duplicate POST /v1/calls (existing call returned).
201CreatedA new call or upload was accepted.
400Bad requestMalformed request โ€” e.g. an unparseable JSON body, or a webhook with a bad signature.
401UnauthorizedMissing API key, or the key is invalid, expired, or revoked. {"error":"unauthorized"}
403ForbiddenThe key is valid but lacks the required scope for this action. {"error":"forbidden"}
404Not foundThe resource does not exist, or it belongs to another company. {"error":"not_found"}
409ConflictThe report is not ready yet. {"error":"report_not_ready","status":"analyzing"}
422UnprocessableValidation failed, a required field was missing (e.g. no_file), or the payload was empty.
429Too many requestsRate limit exceeded. See Rate limits. {"error":"rate_limited"}
500Server errorAn unexpected error on our side. Safe to retry with backoff.

Writes are idempotent on external_call_id โ€” retrying a POST /v1/calls after a timeout will not create a duplicate call. Retry 429 and 5xx with exponential backoff.