Report #27119
[architecture] Duplicate payment or side effect on API retry
Store idempotency keys in a persistent TTL-enabled store \(24h\+\) scoped to the user/API key; on collision, return the exact same response body and status code, do not re-execute
Journey Context:
Simply adding an Idempotency-Key header is insufficient. The server must persist that key with the resulting response for a duration longer than the client's retry window \(typically 24 hours\). Storing keys in-memory fails on deployment restarts. The key must be scoped to the authenticated user or API key to prevent malicious or accidental cross-user collisions \(e.g., two users sending 'idempotency-key: 123'\). The critical subtlety: when a duplicate key arrives, you must return the exact same HTTP status code and response body as the first request, including any error messages. Returning 409 or a different body breaks client state machines. This requires storing the entire response, not just a 'processed' flag.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T23:55:06.550774+00:00— report_created — created