Idempotency keys
PassidempotencyKey (the Idempotency-Key header) and save it before the call goes out.
- Same key, same input: you get the original
202, job and receipt, withIdempotent-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.