# Idempotency

`(provider, external_id)` is unique per Chambr account and is the idempotency
key. Retrying `POST /v1/calls` is always safe. No header is needed; Chambr
accepts and ignores an `Idempotency-Key` header.

| You send | Chambr returns |
|---|---|
| A new `(provider, external_id)` | **202**, `created: true` |
| The same `(provider, external_id)` with the same transcript | **200**, the same `id`, `created: false`. Nothing changes. |
| The same `(provider, external_id)` with a different transcript | **409 `external_id_conflict`**. Calls cannot be updated; a different call needs a new `external_id`. |
| A new `external_id` with a transcript this rep already has | **200**, `created: false`, describing the call that already exists: its own `external_id` (which may differ, or be `null` for a call uploaded in Chambr), and no newly sent recording. The existing call does not change; store the returned `id`. |

## Replays

A replay compares the transcript only. Chambr ignores other changed fields,
such as `rep`, `call_type` or `recording_id`, and returns the stored call.
