Skip to main content

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.

TierBudgetApprox.
basic (default)300 points / min~5 req/s
standard600 points / min~10 req/s
premium6000 points / min~100 req/s
Need a higher limit?

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.

PointsTools
1check_api_health, get_server_time
2get_account, get_balances, get_contacts, get_deposits, get_withdrawals, get_orders, get_assets, get_markets
3get_fills, get_order_fills, get_ledger, get_balance_history
10get_indicative_price
get_indicative_price costs 10 points

It 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:

HeaderMeaning
RateLimit-Limit · X-RateLimit-LimitBudget for the current window.
RateLimit-Remaining · X-RateLimit-RemainingPoints remaining in the window.
RateLimit-Reset · X-RateLimit-ResetSeconds 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.