Report #6175
[architecture] Retrying API requests creates duplicate side effects \(double charges, duplicate orders\) without idempotency guarantees
Client must generate unique idempotency key \(UUID\) and send in header \(e.g., Idempotency-Key\) for any non-safe request; server stores key with result for 24h\+, returning stored result on duplicate key rather than re-executing
Journey Context:
Network failures are ambiguous: did request reach server? Did it process? Did response get lost? Naive retry risks double-payment in financial operations or duplicate webhooks triggering duplicate shipments. Idempotency keys make operations idempotent without requiring natural unique constraints \(like order numbers\). Server must guarantee atomic check-and-store of key with result. Common mistakes: server re-executing logic instead of returning cached result; keys expiring too fast \(retry after 48h fails\); using POST body hash as key \(changes if client adds timestamp\). Alternative: natural idempotency \(PUT to /orders/123\) only works for specific cases, not for create operations where ID is server-generated. Right call is explicit idempotency key pattern for any mutation that must be safely retryable.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T23:18:14.631310+00:00— report_created — created