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 /keyreports the plan and limits of the key making the call.
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.
| Operation | Cost (CU) | Keyless calls per minute |
|---|---|---|
GET /.well-known/x402 | 0 | 300 |
GET /key | 0 | 300 |
GET /status | 0 | 300 |
GET /chains | 10 | 300 |
GET /config | 10 | 300 |
GET /prices | 10 | 300 |
GET /chains/{chain}/farms/{address} | 20 | 150 |
GET /chains/{chain}/pairs/{address} | 20 | 150 |
GET /chains/{chain}/tokens/{address} | 20 | 150 |
GET /chains/{chain}/tokens/{address}/brief | 20 | 150 |
GET /chains/{chain}/tokens/{address}/proof | 20 | 150 |
GET /chains/{chain}/wallets/{address}/funding | 20 | 150 |
GET /launchpads/tokens | 20 | 150 |
GET /leaderboard | 20 | 150 |
GET /pairs/new | 20 | 150 |
GET /perps | 20 | 150 |
GET /prices/at | 20 | 150 |
GET /tokens/{id} | 20 | 150 |
GET /tokens/by-slug/{slug} | 20 | 150 |
GET /trending | 20 | 150 |
GET /wallets/stats | 20 | 150 |
GET /chains/{chain}/tokens/{address}/pairs | 30 | 100 |
GET /chains/{chain}/wallets/{address} | 30 | 100 |
GET /chains/{chain}/wallets/{address}/best-trades | 30 | 100 |
GET /chains/{chain}/wallets/{address}/chart | 30 | 100 |
GET /farms | 30 | 100 |
GET /pairs | 30 | 100 |
GET /perps/{market}/history | 30 | 100 |
GET /perps/liquidations | 30 | 100 |
GET /search | 30 | 100 |
GET /tokens | 30 | 100 |
GET /chains/{chain}/pairs/{address}/trades | 40 | 75 |
GET /chains/{chain}/tokens/{address}/holders | 40 | 75 |
GET /chains/{chain}/tokens/{address}/traders | 40 | 75 |
GET /chains/{chain}/tokens/{address}/verdict | 40 | 75 |
GET /chains/{chain}/wallets/{address}/positions | 40 | 75 |
GET /chains/{chain}/wallets/{address}/rounds | 40 | 75 |
GET /chains/{chain}/wallets/{address}/trades | 40 | 75 |
GET /deployers/{address}/tokens | 40 | 75 |
POST /pairs/batch | 40 | 75 |
GET /wallets | 50 | 60 |
GET /chains/{chain}/pairs/{address}/candles | 60 | 50 |
GET /wallets/{address}/overview | 60 | 50 |
POST /wallets/labels/batch | 60 | 50 |
POST /tokens/batch | 100 | 30 |
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: 17Pace 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+jsonSleep 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.