Skip to main content
A timeout on your side does not mean the call failed. The work may already be accepted, and an accepted job can finish and be charged after you stop waiting. Recover the original call before you send it again.

Idempotency keys

Pass idempotencyKey (the Idempotency-Key header) and save it before the call goes out.
  • Same key, same input: you get the original 202, job and receipt, with Idempotent-Replay: true. No second charge.
  • Same key, different input: 422 idempotency_key_reuse.
  • Same key while the first call is still running: 409 request_in_flight. Wait and retry.
  • The SDK makes a new key for each call when you pass none. To retry across processes, reuse your saved key.

Timeouts

When totalTimeoutMs runs out, the SDK throws RequestTimeoutError with phase, elapsedMs, idempotencyKey, requestId, receiptId and acceptance: accepted when the server returned a request id, unknown otherwise.

Recover a call

GET /v1/submissions/recover?endpoint=...&key=... returns the original handles and status. It needs no new quote or payment, and a read proof is enough. Endpoints: lookup/person-profile, lookup/person-email, lookup/person-email-status, lookup/place-permits, physical-mail/send, solve, predict, sms/send, voice/call, email/send, linkedin/reply, linkedin/message, linkedin/profile-view, linkedin/react, linkedin/invite, linkedin/invite/withdraw, crm/notes, commerce/buy, browser. For a commerce or browser call made without a key, use quote:<X-Quote-ID>.

Service status

agent.getServiceStatus() (GET /v1/status, no auth) returns status (healthy or degraded), observed_at and per-dependency state, with 503 when degraded. Use it to pause a batch, not as a health check for your own load balancer. Every response carries a Server-Timing header with the time spent per phase.