All pages

Guides

Safe retries

Send a request again after a timeout without calling anybody twice.

View as Markdown

Networks fail in the middle of requests. When you did not get an answer you cannot tell whether the call was placed — so send your own id for it, and send it again with the same id.

The Idempotency-Key header

Request The header
Place a call Required. Without it: 400 idempotency_key_required.
Start a chat Optional. The same request again returns the same chat.
Send a chat message Optional. The same message again returns the same reply, without asking the agent twice.

Up to 120 characters. Build it from your own data — lead-8812-attempt-2, not a random string made fresh for each try — so a retry after a crash still carries the same id.

The SDKs make a key for each call and send the same one on each of their own retries. Give your own through their idempotency key option, or as the Idempotency-Key header itself: either way, yours is the one sent.

What happens

Situation Result
Same key, same request The same conversation as it is now, with the header Idempotent-Replayed: true.
Same key, a different request 422 idempotency_key_reused: the agent, the numbers, the values and the metadata are compared.
Same key, two requests at the same moment One of them places the call; the other gets that call.
The call failed after it was saved A retry returns that failed conversation and never calls again. To call again, use a new key.

A key belongs to its conversation for as long as the conversation exists — reusing last week's key returns last week's call. A test key's ids and a live key's never meet.

Ending

Ending a conversation is always safe to send again: ending one that has already ended returns it.