Idempotency
Idempotency ensures that retrying a request produces the same result without duplicating the operation. This is essential for safely handling network failures and timeouts.How idempotency works
When you include anIdempotency-Key header with a request:
- The API creates a fingerprint of your request (method, path, body)
- If the same key is used again with the same fingerprint, the original response is returned
- If the key is reused with a different fingerprint, you receive a
409 Conflicterror
Idempotency keys are scoped to your account. Different accounts can use the same key without conflict.
Using idempotency keys
Add theIdempotency-Key header to any POST or DELETE request:
Key requirements
| Requirement | Details |
|---|---|
| Format | Any valid UUID (v4 recommended for uniqueness), up to 128 characters. Hyphenated, simple, braced, and URN forms are all accepted. |
| Uniqueness | Must be unique per operation |
| Expiration | Keys expire after 24 hours |
Generating idempotency keys
Generate a new UUID for each unique operation:Handling concurrent requests
When a request is in progress and the same idempotency key is used again, the API briefly waits (up to about 3 seconds with exponential backoff) for the original to complete:- If the original finishes in time, the retry returns the original response — same status code, same body.
- If it does not finish in time, the retry returns
409 Conflict:
code: already_exists with the “different request body” 409 below. Distinguish them by the message field, or by checking whether your request body has changed.
Error responses
Match on
code rather than message. Message text is for humans and may change; code is the stable contract.Conflict (different request body)
Invalid key format
a1b2c3d4-e5f6-7890-abcd-ef1234567890).
Retry patterns
Safe retry with idempotency
Handling unknown response status
When a request times out, you don’t know if it succeeded. Using idempotency keys makes retries safe:Best practices
Always use idempotency keys for mutating operations
Always use idempotency keys for mutating operations
Include
Idempotency-Key for all POST and DELETE requests, even if you don’t plan to retry. This protects against accidental double-clicks and network retries.Generate unique keys per operation
Generate unique keys per operation
Don’t reuse keys across different operations. Each logical operation should have its own unique key.
Store keys with operation context
Store keys with operation context
If you need to retry later (e.g., after a server restart), store the idempotency key alongside the operation context.
Don't rely on key expiration
Don't rely on key expiration
Keys expire after 24 hours, but you shouldn’t retry operations after such a long delay. Use fresh keys for new operations.
Endpoints supporting idempotency
TheIdempotency-Key header is honored on every POST and DELETE endpoint. PUT endpoints do not use this header — the backing resource is replaced on each request by design. GET is naturally idempotent.
| Method | Endpoint |
|---|---|
| POST | /v1/subscriptions |
| POST | /v1/subscriptions/{id}/pause |
| POST | /v1/subscriptions/{id}/resume |
| DELETE | /v1/subscriptions/{id} |
| POST | /v1/exports |
| POST | /v1/exports/{id}/cancel |
| DELETE | /v1/exports/{id} |
| POST | /v1/export-schemas |
| DELETE | /v1/export-schemas/{id} |
| POST | /v1/export-schemas/{id}/draft |
| DELETE | /v1/export-schemas/{id}/draft |
| POST | /v1/export-schemas/{id}/publish |
Next steps
Error Handling
Handle API errors gracefully in your application
Rate Limiting
Understand rate limits and how to handle them
Pagination
Navigate large result sets efficiently
API Reference
Explore the complete API documentation