View as Markdown

Idempotency

A network error can hide whether a write ran. Send an Idempotency-Key header with every write, and you can retry it safely.

POST /api/companies/{company_id}/invoices/{invoice_id}/issue HTTP/1.1
Authorization: Bearer osk_live_...
Content-Type: application/json
Idempotency-Key: 5f0c9a1e-6f0b-4c1e-9a52-2b8f0d5b7e41

{}
  • Use a new random key for each new change, for example a UUID. Use the same key only to retry the same request.
  • The command operations and the file upload accept the header. The API reference lists it among the parameters of each operation that takes it.

What a repeat gets

The repeatThe answer
The same key and the same body, after the first request finishedThe first response again, with the header Idempotent-Replayed: true. Nothing runs twice
The same key and the same body, while the first request still runs409 idempotency_in_progress. Wait and retry
The same key with a different body409 idempotency_conflict. Use a new key for a new request
  • The API keeps a key for 24 hours, for each credential and company.
  • Only a success is kept. After an error (a status of 400 or more), you may retry with the same key.
  • When the first request died before it finished, the key is free again after five minutes, and a retry with the same body runs it. The books themselves also remember the key, so a command never runs twice.

Without the header

A write without an Idempotency-Key runs every time you send it. A retry after a timeout can then record the same invoice twice.