Skip to main content
Find your symptom below. For the full reference, see Throttling for why we throttle a request, and Errors for every rejection and its fix.

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.
  • GET works, but POST fails. Without Content-Type: application/json, the server hashed zero bytes. Send that header on every request with a body.
  • Every POST fails, 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‖s signature. 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_REQUIRED when 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-After seconds, 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_LOCKED when 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_EXCLUDED when 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 code on 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 201 means queued, and the exchange answers on the private stream. Read the reject event on the private stream.
  • The 201 never arrived. We may have placed the order anyway. Match clientId on the private stream before you resend, because a resend places it again (Retries).
  • A seq jumped. You missed a message. Take a snapshot, 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

  1. Send the exact bytes to POST /v3/echo. A 200 confirms the host, key, clock, and canonical string at once.
  2. Read code, which is stable. message can change.
  3. Read the private stream before you resend an order.