Fees and limits
Rate limits and errors
Seeryx API limits and errors: the JSON error shape, codes such as below_minimum and rate_limited, HTTP statuses, request limits and retries.
Error format
Every error is JSON with a sentence for people in error; where a program should act on it, a stable code and sometimes more fields.
Errors
{ "error": "Invalid limit" }
{ "error": "Minimum order is 5 shares", "code": "below_minimum", "minimum": 5 }
{ "error": "Post only: this order would trade at once at 16¢; lower the price or turn Post only off", "code": "would_take" }
{ "error": "Too many open orders ...", "code": "open_orders_limit", "limit": { "account": 200, "round": 100 } }
{ "error": "Too many orders", "code": "rate_limited", "retryAfter": 4 }Error codes
| code | Status | Meaning | What to do |
|---|---|---|---|
below_minimum | 400 | Fewer shares than the minimum; minimum says how many | Raise the size |
would_take | 400 | A post-only order would trade at once | Move the price away from the other side |
open_orders_limit | 400 | Too many resting orders; limit has the account and market caps | Cancel some first |
trading_paused | 400 | The session key that signed it was closed | Open a new session and sign again |
rate_limited | 429 | Too many order requests; retryAfter in seconds | Wait, then send the same request |
trading_halted | 503 | Trading is halted for everyone; GET /api/notice may say why | Wait; cancels still work |
Order answers can also carry a reason that is not an error: no_liquidity, beyond_limit and share_limit (see Trading).
HTTP statuses
| Status | When |
|---|---|
| 400 | Invalid input, not enough cash or free shares, a round that is not trading or is closing, an order below the minimum, a post-only order that would trade, a signed order that does not match, a missing or reused Idempotency-Key |
| 401 | A missing, invalid or expired sign-in token (seeryx.com answers these with 403) |
| 403 | A missing, invalid or expired sign-in token on seeryx.com ("Authentication required", "Invalid or expired token"), or a blocked account |
| 404 | Unknown round, market or profile |
| 408 | The request took longer than 30 seconds |
| 409 | Not possible right now: no account yet, a trade still settling, a withdrawal not ready |
| 413 | Body too large: an order, split or merge 16 KB, a batch 15 times that, anything else 100 KB |
| 429 | A rate limit: wait as many seconds as Retry-After says |
| 502 | Solana or the bridge did not answer |
| 503 | Trading halted (code trading_halted), the exchange clock is unavailable, or the server is busy (Retry-After) |
Rate limits
| What | Limit | Counted per |
|---|---|---|
| Orders (each order of a batch counts), cancels, splits, merges | 250 per 10 seconds | Account |
| Resting orders | 200 in all, 100 in one market | Account |
| Your account, orders, positions, balance, /auth/me | 12,000 a minute together | Account |
| Your activity, settled, feed, P&L | 300 a minute together | Account |
| Markets and rounds (/markets..., /rounds/:slug) | 1,200 a minute | IP address |
| Order book, trades, volume, markets summary, round activity | 3,000 a minute | IP address |
| Statistics, leaderboard, profiles, holders | 300 a minute | IP address |
| /auth/nonce, /auth/verify | 30 a minute each | IP address |
| /deposit/recover | 2 a minute | Account |
| WebSocket | See WebSocket | Connection, IP address |
Over a limit the answer is 429 with Retry-After in seconds. A busy server answers 503 with Retry-After. Answers of statistics, the leaderboard and holders may be a few seconds old. GET https://seeryx.com/health answers { "status": "ok" } for uptime checks.
Retrying safely
- 429 and 503: wait as long as
Retry-Aftersays, then send the same request again. - A network error or a 5xx on a write: resend the same body with the same
Idempotency-Key; if the first attempt went through you get its answer, and nothing is placed twice. - 400: do not repeat it unchanged; fix the request, then send it with a new key (and a new signed id).
- 401 or 403: sign in again.