Signature problems
- A 401 on every call. A header, the clock, the key, or the canonical string is wrong. Read
message, then sign a published vector and diff your string against it on Sign a request. GETworks, butPOSTfails. WithoutContent-Type: application/json, the server hashed zero bytes. Send that header on every request with a body.- Every
POSTfails, and the body looks right. Your client re-serialized the JSON after you hashed it. Send the exact bytes you hashed. - Every path fails. You signed the URL, or dropped the mount prefix. Sign the path only, with the mount prefix included.
- A P-256 signature never verifies. You sent a raw
r‖ssignature. Send DER instead, as Algorithms describes. api key not found, but the key exists. You’re on the wrong environment, since a key works only in its own. Check the host on Environments.
Other problems
- A 403 after the 401s cleared. Your signature verified, but the key’s scope doesn’t reach the route. See 403.
- A 403
KYC_REQUIREDwhen you place an order, while cancels still work. The key holder’s KYC lapsed after the key was created. Finish verification in the app. - A 429 while you’re under your own limit. Our servers share token counts with each other gradually. Wait
Retry-Afterseconds, as Throttling explains. - A 451. The request came over a VPN, or the key holder’s last geolocation is missing, failed, restricted, or, on a placement, older than days. Turn off the VPN and open the app, as 451 explains.
- A 423
ACCOUNT_LOCKEDwhen you create a key, open a subaccount, or fund one. The account is excluded or self-excluded. This won’t clear on its own, so contact support (423). - A 423
SELF_EXCLUDEDwhen you place an order, while cancels and reads still work. The key holder is self-excluded. This won’t clear on its own, so contact support (423). - A 423 with no
codeon every trading and catalog route, reads included. The account is locked or excluded, or we’ve halted trading. This won’t clear on its own, so contact support (423). - A 201, but the order isn’t on the book. A
201means queued, and the exchange answers on the private stream. Read therejectevent on the private stream. - The 201 never arrived. We may have placed the order anyway. Match
clientIdon the private stream before you resend, because a resend places it again (Retries). - A
seqjumped. You missed a message. Take asnapshot, as Gaps explains. - A 403 with an HTML body. Our edge refused the body before the exchange saw it. Split the batch.
If nothing matches
- Send the exact bytes to
POST /v3/echo. A200confirms the host, key, clock, and canonical string at once. - Read
code, which is stable.messagecan change. - Read the private stream before you resend an order.

