Documentation menu

Errors

This page lists the errors returned by our services and what to do about each one. The short rule: retry temporary errors with backoff, never retry authentication errors in a loop.

Private TPU Send (HTTPS, JSON-RPC)

Errors are returned as a JSON-RPC error object together with an HTTP status code.

json
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32029, "message": "rate limit exceeded" } }
HTTPJSON-RPC codeMeaningWhat to do
400-32700The body is not valid JSONFix the request
400-32600Not a valid JSON-RPC 2.0 requestFix the request
400-32601Unknown methodUse sendTransaction or getHealth
400-32602Invalid parameters: the transaction cannot be decoded, the encoding is wrong or the transaction is larger than 1,232 bytesCheck the base64 encoding and the size
401-32001Missing or invalid API keyCheck the x-api-key header. Do not retry
403-32003IP address not allowlisted, or the product is not part of your offerCheck your server's public IP address, contact support. Do not retry
429-32029TPS limit exceeded. The transaction was not forwardedPause briefly and resend. Rate-limit on your side
503-32005Temporarily unavailable, for example during maintenanceRetry with backoff. Use a fallback send path if the outage lasts

What is not reported at submission

Private TPU Send does not simulate transactions, so it accepts any well-formed signed transaction. The following problems show up only later, through your RPC:

  • Expired blockhash. The leader drops the transaction and it never appears on-chain. If a signature never shows up, check the blockhash first.
  • Insufficient balance for fees. The transaction is dropped without a trace.
  • Program errors, such as slippage limits or insufficient funds in a swap. The transaction lands in a block, pays its fee and is marked as failed. getSignatureStatuses reports the error.

Simulate through your RPC before sending to catch these early. See Private TPU Send.

gRPC status codes

These codes apply to gRPC connections you open, such as Shreds. For Private Orderflow over gRPC, our relayer connects to your server, so connection problems show up in your server's logs. See Troubleshooting.

StatusMeaningRetry?
UNAUTHENTICATEDMissing or invalid API keyNo. Check the x-api-key metadata
PERMISSION_DENIEDIP address not allowlisted, or the product is not part of your offerNo. Contact support
RESOURCE_EXHAUSTEDToo many concurrent connections for your API keyAfter closing unused connections, with backoff
UNAVAILABLEThe endpoint is restarting or the network path is interruptedYes, reconnect with backoff
DEADLINE_EXCEEDEDA deadline set by your client expiredDo not set deadlines on streaming calls
INTERNAL, UNKNOWNUnexpected server-side errorYes, reconnect with backoff. Report it if it repeats

A stream that ends without an error status was closed by the server, for example before maintenance. Reconnect with backoff.

WebSocket

Errors during the connection upgrade:

HTTPMeaningRetry?
401Missing or invalid API keyNo
403IP address not allowlisted, or the product is not part of your offerNo
429Too many concurrent connections for your API keyAfter closing unused connections, with backoff

Close codes of an open connection:

CodeMeaningRetry?
1000Normal closureYes, if you did not close the connection yourself
1001The server is going away, for example a restart or maintenanceYes, with backoff
1008Policy violation: the API key was revoked or suspendedNo. Contact support
1011Unexpected server-side errorYes, with backoff
1013The server is temporarily overloadedYes, with backoff
4008Slow consumer: your client did not read messages fast enough and the send buffer overflowedYes, after fixing the consumer. See Limits

Always log the close code and reason. Our support needs them to investigate a disconnect.

Retry policy

Retry with backoffDo not retry automatically
HTTP 429 and 503HTTP 400, 401 and 403
gRPC UNAVAILABLE, RESOURCE_EXHAUSTED, INTERNAL, UNKNOWNgRPC UNAUTHENTICATED and PERMISSION_DENIED
WebSocket close codes 1000, 1001, 1011, 1013 and 4008WebSocket close code 1008

Use exponential backoff with jitter, for example 500 milliseconds doubled on every attempt, capped at 30 seconds, plus a random delay of up to 250 milliseconds. Reset the delay after a connection has been stable for a minute.

If an error persists, see Troubleshooting or contact our support: @ZoriDev.

Need help or access? Contact our support on Telegram.

Contact