Skip to main content

Three different identifiers

Receipt ownership is tenant-scoped. A refreshed token or another authorized key for the same tenant can access its receipts. Other tenants receive 404, not another tenant’s call details.

Receipts and replay

A receipt is stored progress for one intentional test. Sending the same retained requestId with the same normalized body returns that receipt without another call. The original createdAt does not change, including after a service deployment. A completed replay can return 202. If a call appears to finish immediately, compare runId and createdAt with your previous test. Omit requestId for each manual new test, or generate a new ID. For retryable automation, generate one ID before the first POST and reuse it with the same payload on every retry of that call. If a request without an ID times out, its generated ID may not have reached you; blindly resending can be a new call. Use explicit stable IDs where duplicate prevention matters. Receipts normally expire after 24 hours, but older terminal receipts can be evicted under history capacity pressure. Retention is not permanent duplicate protection: an expired/evicted ID can be treated as a new request. Active and uncertain work is not evicted just to admit another call. Once a receipt is gone, status returns 404.

Recording states

Startcall returns an error for uncertain/failed/cancelled admission. GET and cancel return 200 for an already-terminal receipt, including Failed or Cancelled; inspect state, not just HTTP success. A nonterminal refresh can temporarily return 503 while failure is being published.

Limits and pauses

Environment and tenant administrators can lower traffic/duration limits or pause new admissions. Limits are not negotiated by request fields. Call duration, request budgets and concurrency are controlled by the effective environment and tenant policies; ask your administrator for the current limits rather than assuming identical limits across environments. The schema describes the API’s hard ceiling, not the currently permitted duration. Only one unresolved call per tenant/station is allowed, so use different configured test stations for parallel calls. Do not use a station that carries live traffic. Custom generated audio still has a separate five-minute cap. Start, token exchange, status and cancel have bounded request budgets. Replays also consume request budget; do not poll aggressively. Honor Retry-After when present and back off with jitter. Not every 429 includes a body or retry header.

Troubleshooting

Token exchange has three error shapes:
  • Endpoint validation/authentication errors (400, 401, 403) use { "error": "..." }.
  • Dependency middleware failures (503) use { "code": "dependency_unavailable" }, without an error field or run ID.
  • Token rate-limit failures (429) have an empty body. Honor Retry-After when supplied.
Call errors normally use { "code": "...", "runId": "..." }, with a null or omitted run ID before admission. Other authentication/rate-limit middleware rejections can also have an empty body. Check the HTTP status and content before decoding JSON; do not assume one error envelope for every token response. Keep credentials out of logs and Support messages.

Completed but no call in Assist?

First exclude a retained replay by checking the receipt’s createdAt and runId. For a genuinely new run, ask Support to trace the recording ID through SIPREC → the intended SIPY subscriber → the configured Assist position → backend delivery. Verify tenant routing, position matching, ANI, audio and downstream integration results separately. Do not treat a 202, SIP acceptance, TCP write or simulator Completed result as proof of end-to-end delivery.