Skip to content

Errors & notices ​

Errors reject a command or report a service failure. Notices are asynchronous messages about an open stream.

Error frame ​

An error carries the id of the command that caused it:

json
{
  "op": "error",
  "id": 1,
  "code": "not_on_plan",
  "feature": "detail_full",
  "message": "..."
}
CodeMeaningClient action
unauthorizedKey is missing, unknown, or revokedStop and provide a valid key
invalid_paramsUnknown/missing parameter or value outside its allowed setFix the command; do not retry unchanged
invalid_addressmint or wallet is not a Solana addressValidate the address locally
invalid_mintAddress exists but is not a token mintUse a token mint
unknown_streamStream name does not existUse one of the eight documented names
duplicate_subscriptionThe sub name is already in use on this connectionPick another name, or reuse the subscription you have
subscription_limitPlan's open-subscription limit is exhaustedUnsubscribe or upgrade
connection_limitPlan's concurrent-connection limit is exhaustedClose another connection or upgrade
rate_limitedCommand rate is too highBack off before retrying
not_on_planRequested feature is outside the planInspect feature; remove it or upgrade
internal_errorService failed while processing the commandRetry with backoff; report persistent failures

not_on_plan features ​

feature is one of:

  • stream
  • detail_full
  • include_raw
  • cursor
  • candles
  • candle_interval
  • quota

The human-readable message includes a link to the pricing page. Branch client logic on code and feature, not on the message text.

Notice frame ​

A notice is not tied to a command. It reports stream state and normally carries the affected subscription:

json
{
  "op": "notice",
  "code": "gap",
  "sub": "tt_1",
  "message": "..."
}

Notices come in two kinds, and the difference is the only thing your reconnect logic needs from them: after the first kind the connection keeps working, after the second it is closing.

The connection keeps working ​

CodeWhat happenedClient action
gapCursor is older than the replay window; delivery starts liveRecord the gap and continue
replay_rate_limitedReplay allowance is exhausted; delivery starts liveContinue without replay
droppedClient read too slowly and events were lost; cursor is the first lost eventRecord the gap, narrow filters, or speed up consumption
quota_exceededFree monthly traffic quota is exhaustedWait for the next period or upgrade

dropped is emitted once per loss series. Repeated notices mean the subscription should be narrowed with filters or consumed faster.

With quota_exceeded the connection and every subscription stay open — delivery simply stops until the next period, and new subscriptions are refused with not_on_plan and feature: "quota". There is no warning before the limit.

The connection is closing ​

The notice arrives immediately before the close frame, so it is the last thing you receive. Read the code before you decide whether to reconnect.

CodeWhat happenedClient action
ping_timeoutNo pong and no command arrived within the read timeoutAnswer server pings, or send {"op":"ping"} if a proxy drops them; then reconnect
slow_consumerReading is consistently behindReconnect only after fixing consumption speed
server_restartService is restartingReconnect with backoff and the last processed cursor
plan_changedThe plan on this account changedReconnect; the new limits apply from the next connection
key_revokedThe key was revoked while connectedStop using it and rotate the credential
account_bannedThe account is blockedDo not reconnect; contact support
account_deletedThe account no longer existsDo not reconnect

plan_changed is the one to handle deliberately: limits are read when a connection opens, so an upgrade takes effect on the next one. Reconnect and you have the new plan.

Retry policy ​

Use exponential backoff with jitter for internal_error, restarts, and network disconnects. Do not automatically retry malformed commands, invalid keys, or plan denials unchanged.

Realtime Solana data API