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 retainedrequestId 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. HonorRetry-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 anerrorfield or run ID. - Token rate-limit failures (
429) have an empty body. HonorRetry-Afterwhen supplied.
{ "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’screatedAt 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.
