UNKNOWN_MARKET | No | The MarketStream didn’t resolve to a real market, or resolved to one the venue’s catalogue does not list. Check the id; retrying won’t help. A market that exists but isn’t trading yet comes back as MARKET_NOT_YET_OPEN instead, and a newly listed one as UNAVAILABLE, so UNKNOWN_MARKET on a market you know is scheduled means the identifier is wrong. Also returned for a Kalshi subscribe naming the unsupported no side: a Kalshi ticker addresses a single YES-priced book, so that request is refused permanently; subscribe with side YES or omit it. On that refusal the frame is connection-level: it carries code, message and your requestId, with no market and no channel. The socket stays open. |
MARKET_NOT_YET_OPEN | Yes, but only near the start time | The market is real and we know about it, but its order book isn’t carried yet: books open closer to an event’s start time rather than as soon as the market is listed. Distinct from UNKNOWN_MARKET, which means no such market, and from UNAVAILABLE, which means a market we should be carrying and currently can’t. Your subscription is torn down. Retrying on UNAVAILABLE’s cadence will just refuse repeatedly for as long as the event is far out: wait until the event is close to starting and subscribe again. Not every venue can answer this, so a market whose book hasn’t opened may still surface as UNAVAILABLE elsewhere. |
QUOTA_EXCEEDED | No, retrying alone won’t help | One of three connection limits. The per-connection subscription cap: unsubscribe something or open another connection. The subscribe batch cap: the frame named more markets than one connection can hold, so nothing in it was subscribed; split it. The control-frame rate: you sent frames faster than the connection accepts; slow down and resend. The socket stays open in every case. |
NOT_AUTHORIZED | No | Not authorized for this operation. |
UNSUPPORTED_CHANNEL | No | The requested channel isn’t available on this market’s venue. The trade tape is published by Polymarket, Kalshi and ProphetX, so a TRADE subscribe on a Limitless market comes back with this code. The error carries market + channel; no subscription is created and other entries in the same batch are unaffected. |
SERVICE_DEGRADED | Yes, with backoff | The service is temporarily degraded (e.g. an upstream link is down). Retry shortly. |
SNAPSHOT_TIMEOUT | Not applicable | Reserved, and not currently emitted. A subscribe whose first snapshot never arrives is reported as UNAVAILABLE. Handle the code if you switch on the enum exhaustively, but don’t build retry behaviour around it. |
UNAVAILABLE | Yes, after a delay | The market exists but can’t be streamed right now: the first snapshot didn’t arrive, or an upstream venue read failed after retries. Distinct from UNKNOWN_MARKET: this one is worth retrying, that one is not. Your subscription is torn down, so this is terminal for that subscription, but the condition is usually transient: resubscribe after a short delay rather than immediately, and treat repeated failures for one market as that market being unavailable for now. On ProphetX, a newly listed line (for example an alternate spread or total added as the main line moves) can take up to about 15 minutes to stream, and is answered with this code until then, so keep resubscribing at a modest interval. |
INTERNAL | Only for server faults | An unexpected server-side fault, or a frame that failed validation. If your client always builds the frame the same way it will keep failing, so don’t retry blindly: retry once or twice with backoff to rule out a transient fault, and if it persists inspect the frame you sent before retrying further. Contact support if the frame is correct. |