What it is
An auditor for idempotency keys. It replays your logged requests against the rules a correct API follows and books each one as first write, safe replay or problem.
Idempotency audit for payment and order APIs
Idempotency Ledger reads your request logs, books every write under its idempotency key and shows where a retry created a second charge, a second order or a second payout. Each problem comes with the amount at risk and the fix.
Charges by keyNo. 0417
| Time | Key | Amount |
|---|---|---|
| 10:00:00 | ik_7f3a | 49.99 |
| 10:00:03 | ik_7f3a | 49.99 |
| 10:05:00 | ik_c044 | 89.00 |
| 10:05:00 | ik_c044 | 89.00 |
| 10:12:00 | ik_f611 | 9.99 |
Extra charged+89.00 EUR
An auditor for idempotency keys. It replays your logged requests against the rules a correct API follows and books each one as first write, safe replay or problem.
Backend and payments engineers, SREs and support leads who need to know whether a customer was really charged twice and why.
Retries are normal, but a retry that runs the work again creates real money problems. Logs hide them among thousands of lines. The ledger brings them to the top with totals.
Paste or open a log export. Nothing is uploaded; parsing and checks run in this page.
One request per line, or a JSON array, or CSV with a header row.
Fields are found by name: time or ts, method, path or url, status, idempotency key, an id of the created object such as charge_id or order_id, amount, currency and customer. Nested JSON and Idempotency-Key headers work too.
Paste a log and press Audit log, or load the sample to see every kind of finding.
Each repeated key is checked in time order against what a correct server should have done.
Same key, same request, two different created ids. The server ran the work twice. This is the costly one.
Two copies landed within two seconds and both succeeded. Common with double clicks and aggressive client retries.
An old key came with new parameters. A correct server refuses with 422. Accepting it hides client bugs.
A 5xx that still created an object, followed by a retry that created another. Only visible when logs carry ids.
Writes without a key cannot be deduplicated. Two identical ones close together are booked as a duplicate.
A key that returns after the window is treated as new work. Choose the window to match your server.
Take the requests to one endpoint or service for a time range from your gateway, load balancer or app logs.
JSON lines, a JSON array, CSV with headers or plain lines with key=value pairs all work.
Pick how long your server keeps keys. Stripe style APIs use 24 hours.
Problems are listed first with the amount at risk. Open a key to see each line and the fix, then copy the report or download the CSV.
A unique value the client sends with a write. If the same request comes again with the same key, the server returns the first result instead of doing the work twice.
It means a second copy arrived while the first was still running and the server refused to run it in parallel. The client can retry later and get the stored result.
Accepting new parameters under an old key means the client has a bug that reuses keys. The next time it will create a wrong charge that looks like a replay.
They make the audit precise. Log the id of the object each write created, such as charge_id or order_id.