InvalidRequestPayload | 400 | The request body could not be parsed as a valid DerivaDEX request. Duplicate keys, malformed JSON, wrong field types, null replay fields, negative replay fields, or out-of-range replay fields also return this code. | No | Fix the request contents, then sign and encrypt it again. |
ReplayFieldMissing | 400 | The submitted signed request is missing clientTimestampMs or recvWindowMs. | No | Fetch operator time from /v2/time, add both replay-window fields, then sign and encrypt the request again. |
ReplayWindowZero | 400 | recvWindowMs is 0. | No | Use a positive receive window. Client helpers default to 5000. |
ReplayWindowTooLarge | 400 | recvWindowMs is greater than 60000. | No | Use a receive window no larger than 60000 milliseconds. |
ReplayTimestampOverflow | 400 | The replay-window expiry cannot be represented safely. | No | Use a valid operator-time timestamp and receive window. |
SignedRequestAuthenticationFailed | 401 | The EIP-712 signature, signed request type, or delegated-session proof does not authorize the submitted request. | No | Sign the current request type, including clientTimestampMs and recvWindowMs, and use a valid delegated-session proof when one is present. |
Forbidden | 403 | Trusted trader deny-list state rejected the delegated-session signer. | No | Fix the delegated-session authorization state before trying again. |
NonceCollision | 409 | The operator has already retained a different signed request for the same trader, request family, and nonce. | No | Treat the request as a different intent and create a new signed request with a fresh nonce. |
NoChangesRequested | 409 | A profile-update request was proven to be a no-op before request indexing. | No | Do not retry the same signed body. No request was indexed, and there is no receipt or requestIndex. |
ReplayTimestampExpired | 412 | The signed replay window has expired. | No | Create a new signed request only if the trader is intentionally submitting a new intent. |
ReplayTimestampTooFarInFuture | 412 | clientTimestampMs is at least 1000ms ahead of operator time. | No | Fetch a fresh time snapshot from the same operator, then sign a new request. |
NotAcceptingRequests | 421 | The operator is temporarily unable to take this kind of request. This can happen during leader changes, readiness changes, or other short-lived request-path transitions. | Sometimes | For a signed request that may have reached the operator, retry the exact signed body while its replay window remains valid or check committed identifiers. Otherwise wait for readiness before signing a new request. |
InvalidEncryption | 422 | The operator could not decrypt the encrypted payload bytes. | No | Re-encrypt the exact signed payload with the current operator key. |
SafetyFailure | 422 | Request validation rejected the order or account action because it broke a trading, balance, or withdrawal rule. | No | Fix the request or the account state before retrying. |
RateLimit | 429 | The authenticated signer exceeded the current request quota. | No automatic retry | Slow down before submitting another request. Do not re-sign and resend automatically. |
InternalServerError | 500 | An internal server fault prevented a final answer. | Only while valid or after checking the result | Treat signed-request completion as unknown. Retry the exact signed body while its replay window remains valid, or check committed identifiers before signing a new intent. |
TrustedTimeUnavailable | 503 | The operator cannot prove trusted replay-validation time. | Sometimes | Wait for operator readiness before signing or retrying. Do not substitute local clock time. |
ServiceUnavailable | 503 | A required dependency was not ready. Today this includes MarketPriceNotAvailable. | Sometimes | Wait briefly, then try again. If it keeps happening, check whether price data or another dependency is missing. |