Report #104348
[architecture] How do I design idempotency keys for an API endpoint?
Require a client-provided idempotency key \(UUID v4\) in the request header \(e.g., Idempotency-Key\). On the server, store the key in a dedicated table \(key, response, expiration\) with a unique constraint. On duplicate key, return the cached response \(including same HTTP status code\). Use a 24-hour TTL on the key to limit storage. Never let a client replay the same key with different request bodies — reject with 422 Unprocessable Entity.
Journey Context:
Common failure: teams try to derive idempotency from request fields \(e.g., hash of body\) which breaks on retries with different timestamps or trace IDs. Stripe's API is the canonical reference — they use explicit idempotency keys because natural keys \(like order numbers\) are not always available in all workflows. The storage cost is worth it: without idempotency keys, a network timeout or client retry can create duplicate charges, orders, or database inserts. The TTL of 24 hours covers most retry windows; longer TTLs require partitioning or archival strategies.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-08-02T20:06:34.593603+00:00— report_created — created