Rate limits
Limits use a point budget per 60-second window, based on your key's tier. Each operation consumes points by its weight: a standard read costs 1 point; heavier or fan-out operations cost more.
Enforced in two dimensions
The tier budget is checked simultaneously per account and per key, and the stricter one wins:
- Per account — the primary limit. The tier budget is shared across all the keys on your account, so minting extra keys does not multiply your total limit.
- Per key — each key uses the tier budget by default, and can be given a tighter sub-limit to cap an individual key.
Tiers
New keys start on basic. Tiers are limit bands, not billing plans.
| Tier | Budget | Approx. |
|---|---|---|
basic (default) | 300 points / min | ~5 req/s |
standard | 600 points / min | ~10 req/s |
premium | 6000 points / min | ~100 req/s |
To move to a higher tier, contact Skipo support. Tiers are adjusted by Skipo; they are not self-serve.
MCP tool costs
The MCP server draws on the same budget as the REST API: a tool call costs the points listed below, not a flat 1 point.
| Points | Tools |
|---|---|
| 1 | check_api_health, get_server_time |
| 2 | get_account, get_balances, get_contacts, get_deposits, get_withdrawals, get_orders, get_assets, get_markets |
| 3 | get_fills, get_order_fills, get_ledger, get_balance_history |
| 10 | get_indicative_price |
get_indicative_price costs 10 pointsIt is the only tool that reaches an external pricing provider, which is why
it costs 10× a plain read. On the basic tier (300 points/min) that is roughly
30 calls per minute before you are throttled — even if the rest of your
budget is untouched. If you plan to poll for prices, space the calls out or ask
for a higher tier.
Headers
Every authenticated response includes the standard (IETF draft) headers along with their legacy equivalents:
| Header | Meaning |
|---|---|
RateLimit-Limit · X-RateLimit-Limit | Budget for the current window. |
RateLimit-Remaining · X-RateLimit-Remaining | Points remaining in the window. |
RateLimit-Reset · X-RateLimit-Reset | Seconds until the window resets. |
429 response
If you exceed the limit, you receive a 429 Too Many Requests with an
application/problem+json body and a Retry-After header:
HTTP/1.1 429 Too Many Requests
Retry-After: 3
Content-Type: application/problem+json
{
"type": "https://docs.skipo.com/errors/rate_limited",
"title": "Rate limit exceeded",
"status": 429,
"code": "rate_limited",
"retryable": true
}
Always honor Retry-After and apply exponential backoff when you get a 429.