Report #70351
[architecture] Idempotency keys: when should I require them on write APIs and what should the key scope be?
Require an idempotency key on every mutating endpoint that can be retried, scope it to the caller \(account/user\), hash the request body into the stored response, and return 409 with the stored response on a body mismatch rather than silently overwriting.
Journey Context:
Most teams either skip idempotency entirely or implement a naive key→response cache that ignores request contents. The failure mode is two different payloads with the same key producing the wrong outcome. The real pattern is: key \+ request fingerprint → response, scoped to the caller, with a deterministic conflict response. Stripe’s design is the canonical reference: keys are client-supplied, responses are replayed for matching keys, and mismatched payloads are rejected. This prevents double-charge/double-create without requiring global UUID generation on the client.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T00:40:09.396214+00:00— report_created — created