intent_replay
The signed intent passed every other check, but its nonce was already used by this agent.
HTTP 403 · permission_error · not retryable
What happened
Section titled “What happened”The signed intent passed every other check, but its nonce was already used by
this agent. Each intent works once: of any number of concurrent sends of one
header, exactly one succeeds. An intent old enough for its nonce to be pruned is refused as
intent_invalid with reason expired instead.
| Reason | Param | Message |
|---|---|---|
replay |
nonce |
This signed intent was already used at {time} UTC. Sign a new intent, with a fresh nonce, for every call. |
replay (the first use was pruned meanwhile) |
nonce |
This signed intent was already used. Sign a new intent, with a fresh nonce, for every call. |
What to do
Section titled “What to do”Sign a new intent, with 128 fresh random bits as its nonce, for every call, retries included. If you didn’t send the request twice, something on the path did: treat it as a replay attempt and check what sits between the agent and Deedglass.
Example
Section titled “Example”{ "error": { "type": "permission_error", "code": "intent_replay", "message": "This signed intent was already used at 09:30:02 UTC. Sign a new intent, with a fresh nonce, for every call.", "param": "nonce", "request_id": "req_01j9zr3m5k8q2w7x4t6v0b1c9d", "doc_url": "https://docs.deedglass.com/errors/intent_replay" }}The message is for a person and can get more exact over time: branch on type and code, never on the message.
In the SDKs
Section titled “In the SDKs”| SDK | Raised as |
|---|---|
TypeScript (@deedglass/sdk) |
PermissionDeniedError with code === "intent_replay" |
Python (deedglass) |
deedglass.PermissionDeniedError with .code == "intent_replay" |