Idempotency-Key header, and a retry with the same key returns the stored result at no extra charge.
How it works
SendIdempotency-Key on any POST, PUT, PATCH, or DELETE. Generate one UUID v4 per logical operation before the first attempt, and reuse it for every retry of that operation. A retry with a new key runs and is billed again.
The header covers every write route outside /api/auto-apply/*: POST /api/jobs/search and the feed endpoints POST /api/jobs/feed, POST /api/jobs/feed/managed, and POST /api/jobs/feed/{feed_id}. Auto Apply keeps its own records; see the Auto Apply exception.
What gets stored, and for how long
On the feed, use a new key for each new cursor. Reusing the previous page’s key returns that stale page.
What a replay returns
A replay returns the original status code and body, plusX-Idempotent-Replay: true. It is not billed again and does not count toward your rate limits.
The original’s other headers, such as X-Has-More, X-Credits-Deducted, and X-RateLimit-*, are not replayed. On a feed replay, read has_more and next_cursor from the body. See Response headers.
Worked example: retry after a dropped connection
The server completes attempt 1, but the connection drops before the response arrives. The client retries with the same key and body:The Auto Apply exception
/api/auto-apply/* routes skip the shared cache. POST /api/auto-apply/applications requires an Idempotency-Key and keeps its own durable 24-hour record. It returns explicit errors instead of a silent replay:
Create blocks until the first fields are discovered. Repeating it with the same key and body re-attaches to the in-flight application and resumes the same wait, so it is also the recovery path. See Recovery.
POST /api/auto-apply/applications/{id}/answers is accepted once per correction round, so a duplicate post attaches to the in-flight wait instead of submitting twice.
A key used on a live-key create cannot be reused on a sandbox-key create, or the other way round. That returns 409 idempotency_key_reuse.

