Authentication and limits

No key needed. What a keyless caller gets, how heavier calls count, and what a key changes.

No key needed

Every operation answers an unauthenticated request. A keyless caller shares one budget per client address across all operations: an IPv4 address counts on its own, an IPv6 address by its /64.

A key only raises the limits. It goes in a header, never in the query string:

X-API-Key: <your key>
Authorization: Bearer <your key>
  • A key that is sent but unknown or revoked is 401, never a quiet downgrade to the keyless tier.
  • A key in the query string is rejected with 400 key_in_query: query strings end up in proxy logs and browser history.
  • GET /key reports the plan and limits of the key making the call.
Key issuing is not open yet. Everything on this site works without one.

Keyless limits

Without a key you get 300 calls per minute per client address (5 per second, burst 20), counted in units of 10 CU. A call spends its operation's x-avee-cost-cu, never less than one unit, so heavier operations run slower. The largest page a keyless call can ask for is 50 rows.

OperationCost (CU)Keyless calls per minute
GET /.well-known/x4020300
GET /key0300
GET /status0300
GET /chains10300
GET /config10300
GET /prices10300
GET /chains/{chain}/farms/{address}20150
GET /chains/{chain}/pairs/{address}20150
GET /chains/{chain}/tokens/{address}20150
GET /chains/{chain}/tokens/{address}/brief20150
GET /chains/{chain}/tokens/{address}/proof20150
GET /chains/{chain}/wallets/{address}/funding20150
GET /launchpads/tokens20150
GET /leaderboard20150
GET /pairs/new20150
GET /perps20150
GET /prices/at20150
GET /tokens/{id}20150
GET /tokens/by-slug/{slug}20150
GET /trending20150
GET /wallets/stats20150
GET /chains/{chain}/tokens/{address}/pairs30100
GET /chains/{chain}/wallets/{address}30100
GET /chains/{chain}/wallets/{address}/best-trades30100
GET /chains/{chain}/wallets/{address}/chart30100
GET /farms30100
GET /pairs30100
GET /perps/{market}/history30100
GET /perps/liquidations30100
GET /search30100
GET /tokens30100
GET /chains/{chain}/pairs/{address}/trades4075
GET /chains/{chain}/tokens/{address}/holders4075
GET /chains/{chain}/tokens/{address}/traders4075
GET /chains/{chain}/tokens/{address}/verdict4075
GET /chains/{chain}/wallets/{address}/positions4075
GET /chains/{chain}/wallets/{address}/rounds4075
GET /chains/{chain}/wallets/{address}/trades4075
GET /deployers/{address}/tokens4075
POST /pairs/batch4075
GET /wallets5060
GET /chains/{chain}/pairs/{address}/candles6050
GET /wallets/{address}/overview6050
POST /wallets/labels/batch6050
POST /tokens/batch10030

Reading the headers

Every limited response reports where you stand, in the IETF RateLimit headers and the older X- convention side by side:

RateLimit-Policy: "plan";q=5;w=1;burst=20
RateLimit: "plan";r=17;t=1
X-RateLimit-Limit: 5
X-RateLimit-Remaining: 17

Pace yourself on the remaining count rather than waiting for a refusal.

When you are over

HTTP/1.1 429 Too Many Requests
Retry-After: 1
Content-Type: application/problem+json

Sleep for Retry-After seconds, then retry. Retrying at once only spends the next second's budget.

Paying past the limit

Instead of waiting, a keyless client can pay for the call in USDC with x402: the 429 carries the payment requirements, and a paid retry answers at once.

On this page