Report #83839
[architecture] How to prevent duplicate charges when retrying failed API requests
Client generates a UUID idempotency key and sends it in a header \(e.g., Idempotency-Key\). The server stores the mapping of \(key, response\) with a TTL \(e.g., 24h\) and returns the cached response on replays without re-executing the business logic.
Journey Context:
Developers often try to make POST requests idempotent by using database unique constraints or checking for existing records before insert, which creates race conditions and doesn't handle the response caching requirement. The hard-won insight is that the client must generate the key \(not the server\), and the server must store the entire response payload \(not just a success flag\) to replay correctly. Keys must have a TTL to prevent unbounded storage growth.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T23:18:47.514420+00:00— report_created — created