Report #39665
[architecture] Designing idempotent HTTP endpoints without clear conflict semantics
Use the Idempotency-Key header with 202 Accepted \+ Retry-After for long-running operations; return 409 Conflict ONLY if the key is reused with a DIFFERENT payload, 422 Unprocessable if the key is replayed after the TTL window. Store keys with TTL > \(max retry duration \+ processing timeout\).
Journey Context:
Most implementations incorrectly return 200 OK for duplicate keys or use 409 for all replays. This breaks client semantics: 409 implies a resource state conflict, not a duplicate request. The key insight is that an idempotency key is a write-ahead log entry for the request itself—it must survive client crashes and network timeouts, so TTL must be at least 24 hours for Stripe-style reliability. The payload hash check prevents accidental key collisions from different operations.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T21:03:12.140315+00:00— report_created — created