Idempotency-Key header on any retried POST so a network
hiccup never double-charges the team.
X-Request-Id — without re-running the work.
When to use it
Any time the request mutates state and a retry could double-bill. In practice that is:| Route | Why idempotency matters |
|---|---|
POST /v1/evaluations | Creates an evaluation. Re-runs spawn duplicates. |
POST /v1/evaluations/{id}/ratings | Submits a rating. Re-submits skew agreement. |
POST /v1/evaluations/{id}/run-autousers | Queues paid autouser runs. The expensive one. |
POST /v1/api-keys | Mints a key. Re-mints leak credentials. |
POST /v1/autousers | Creates an autouser persona. |
POST /v1/templates | Creates a template / dimension. |
GET, PATCH, and DELETE are already idempotent at the protocol
level — Idempotency-Key is ignored.
Key format
- Up to 255 characters.
- We recommend a UUID v4 generated by your client per logical request, not per HTTP attempt. A retry uses the same key.
- Scope: per team. Two teams using the same key string see independent records.
Mismatched bodies
If you replay a key with a different body, we 409:TTL
Records are kept 24 hours from first use, then garbage-collected. After that the key is reusable. In practice, generate fresh keys; reuse is for retries within a single workflow.Combining with retries
Idempotency-Key and exponential backoff are complementary. The first
makes the server safe to retry; the second decides when.
Webhooks: idempotency on the receiver
Your webhook receiver should be idempotent too. Use theAutousers-Event-Id header as the dedup key. See
Retry & replay.