Credits, API Keys & Rate Limits
How API usage is counted
Every request you make to the Raiden Terminal API with an API key costs a fixed number of credits, set per endpoint and listed in Credits per Endpoint. This page covers how you get credits, how each request is billed, API keys, rate limits, errors and WebSocket billing.
- 1 credit ≈ 1 request served from memory: about 5 ms of work or 25 KB of JSON. Heavier endpoints cost more.
- The response headers say what each request cost.
- Browsing the Terminal website never uses credits.
Getting credits
- Free trial: 200,000 credits, once. Connect a Solana wallet and create your first API key. Trial credits don’t renew, and free trials are limited per network.
- Beta plan: 10,000,000 credits per month. Early users are on Beta. Credits renew on the 1st at 00:00 UTC, and unused monthly credits don’t carry over.
- Need more? Monthly plans are available on request while paid plans are being prepared: ask on Discord .
Response headers
These headers come with every response to a request made with a valid key: success or error, free endpoints included, and with the 402.
| Header | Meaning |
|---|---|
X-Credits-Cost | What this request cost: the endpoint’s price on a success; 1 on an error the endpoint answered itself (400, 404, …; 0 on free endpoints); 0 on a 402 and on our own errors (5xx). |
X-Credits-Remaining | What is left on the pool the key uses, after this request. |
X-Credits-Reset | When the monthly credits renew (RFC 3339, the 1st at 00:00 UTC). Absent on the free trial, which does not renew. |
X-Credits-Pool | general (shared by your keys) or dedicated (this key’s own monthly budget). |
X-Credits-Warning | Only when a threshold is crossed: used_50, used_80, used_95, then exhausted. |
Responses without credit headers. Refusals that come before the price (a 403 about the key or its account, 503 credits_unavailable or keys_unavailable) and every 429 carry none.
HTTP/2 200
X-Credits-Cost: 2
X-Credits-Remaining: 199998
X-Credits-Pool: general
HTTP/2 402
X-Credits-Cost: 0
X-Credits-Remaining: 0
X-Credits-Pool: general
X-Credits-Warning: exhaustedOut of credits: HTTP 402
A request that costs more than what is left is refused with HTTP 402, and nothing is charged. The 402 applies from the first request over your balance, on every pool.
Stop and don’t retry. A 402 has no Retry-After. Wait until you have credits again: the monthly renewal, a plan or a top-up.
The JSON body tells you what happened:
cost— the price of the refused request.remaining— what is left.code— which pool ran out (see the table below).
| Code | Meaning |
|---|---|
credits_exhausted | Your general pool is used up, or your account has no credits yet: its network had reached the free-trial limit, or trial credits were unavailable when you created your first key (create another key to retry). |
key_budget_exhausted | This key’s dedicated monthly budget is used up. Your other keys keep working. |
trial_exhausted | Your free trial is used up. Trial credits don’t renew. |
{
"error": "Insufficient credits: this request costs 20 credits and your trial has 0 left. Trial credits don't renew. To keep using the API, ask Raiden for a plan on Discord and include your key id 118: https://discord.com/invite/raiden-wtf",
"code": "trial_exhausted",
"pool": "general",
"plan": "trial",
"key_id": 118,
"cost": 20,
"remaining": 0,
"reset_at": null,
"docs": "https://terminal.raiden.wtf/docs-api#credits"
}Warnings come first. Before you run out, X-Credits-Warning reports used_50, used_80 and used_95, and the same warnings show on your API keys & credits page.
API keys
- Up to 10 keys per account. Every key has full access: all data endpoints, plus your wallet lists, favorites and streams.
- General pool or dedicated budget. A key uses your general pool, or a dedicated monthly budget set aside for it (monthly plans). A key with a dedicated budget stops with
402when its budget runs out and never uses the general pool. - Rotate a key to get a new secret with the same name, budget and limits. The old secret stops working immediately.
- Revoke a key to stop it for good.
- Check your balance for free with
GET /account/balanceand your key: it costs 0 credits and works at 0 credits. - Keys can’t manage keys. The other
/accountroutes answer a key with403session_required.
A secret is shown once, when you create or rotate the key.
Rate limits
- 20 requests per second, burst 40, per account. The limit is shared by all your keys: more keys never add throughput.
- Optional per-key limit. You can give a key its own lower limit. Without one, a single busy key can use the whole shared limit.
- Free trial: at most 2 heavy requests in flight (packs and the analytical endpoints). One more answers
429too_many_concurrent(scopeconcurrency).
Over the rate limit you get 429 rate_limited with Retry-After (seconds), X-RateLimit-Scope (account or key) and X-RateLimit-Limit.
Errors
Error format
- Keys, credits and limits. Refusals are JSON
{"error": "…", "code": "…"}: an English sentence and a stablecodeto branch on. Some add fields such asscope,param,maxorcost. - Other errors of the data endpoints are
{"error": "…"}, some with acodeas well (for example503warming_upbelow). Branch on the HTTP status.
What an error costs
401,402,403and429cost 0, and so do our own errors (5xx).- Any other error the endpoint answers itself (
400,404, …) costs 1 credit (0 on free endpoints).
Error codes
| Status | Code | When | Retry-After |
|---|---|---|---|
402 | credits_exhausted · key_budget_exhausted · trial_exhausted | Out of credits. Stop and don’t retry until you have credits again. | never |
403 | invalid_api_key · api_key_revoked · api_key_suspended | The key is unknown, revoked (or replaced by a rotation) or suspended. | — |
403 | account_suspended · account_banned · account_not_ready | The key’s account can’t use the API. | — |
403 | session_required | A key can’t manage keys: the /account routes answer it with 403, except GET /account/balance. | — |
403 | api_key_required | Website requests without a key: this endpoint or parameter needs one (see Website limits). | — |
429 | rate_limited | Over your shared or per-key rate limit (X-RateLimit-Scope: account or key). | yes |
429 | too_many_concurrent | Free-trial account with 2 heavy requests already in flight (X-RateLimit-Scope: concurrency). | yes |
429 | too_many_invalid_keys | Too many requests with unknown, revoked or suspended keys from your address. | yes |
503 | server_busy | The server is shedding load. | yes |
503 | credits_unavailable · keys_unavailable | Balances or keys are loading. | yes |
503 | warming_up | /smart-money only: its data is loading (right after a server restart, or while the background refresh has been failing for over 2 minutes). The request can be held for up to 10 s before this answer. Retry-After is 5 seconds. | yes |
503 | service_unavailable | On /tokens/{mint}/funding-clusters, /wallets/{addr}/copytrade and /wallets/{addr}/execution-cost: the same analysis failed a few seconds ago (usually a timeout), so it is not run again on every retry. Retry-After (at most 20 seconds) says when it will be computed again. Inside /tokens/{mint}/pack the funding_clusters part is null instead. | yes |
Retry-After
Retry-After is a wait in seconds. It comes only with:
- the responses marked yes in the table above;
- the sign-in and key-management limits:
429too_many_sign_in_attempts,too_many_step_ups,too_many_changesandtoo_many_new_accounts; - the website limits below:
429hourly_volume_limitand503heavy_capacity.
It never comes with a 402.
WebSocket streams
Setting up custom streams is free (up to 3 per account). What costs credits is keeping a keyed connection open. See Streams (WebSocket) for the stream endpoints.
Connection billing
- Each connection opened with an API key (
/ws?key=…&sub=…, or the key in anX-API-Keyheader) costs 1 credit per started minute, charged to the key’s pool. - 1 credit is reserved when the connection opens, then 1 more at the start of every following minute.
- Without credits, the handshake answers HTTP
402with the usual JSON body.
Connection limits
| Keyed connections open at once | Limit | Over the limit |
|---|---|---|
| Per account | 2 × your stream limit (6 with the default 3 streams) | 429 ws_connection_limit |
| Per IP address | 20 | 429 too_many_connections |
Neither limit sends Retry-After: close a connection before opening another.
Close codes
| Code | Meaning | What to do |
|---|---|---|
4402 | Out of credits | Reconnect once you have credits again. |
4401 | Key revoked or rotated | Don’t reconnect with it. |
4403 | Key or account suspended | — |
4404 | Stream turned off or deleted | — |
1013 | Credits temporarily unavailable | Reconnect after a short wait. |
1001 | Server restarting | Reconnect. |
Refused handshakes
A refused handshake answers HTTP with the usual JSON body:
403invalid_api_keyfor an unknown key (or another key code from the error codes table).401invalid_streamfor an unknown or inactive stream token.503withRetry-Afterwhile keys or balances are loading.
Live data on the Terminal website is free: up to 20 connections per IP address, 100 topics each.
Website limits
Browsing the Terminal website is free, but the website is not a second, keyless API.
Endpoints and parameters that need a key
Without a key, these endpoints answer 403 api_key_required, even from the browser:
/tokens/{mint}/pack/wallets/{addr}/pack/aggregates/rug-wallets/sitemap-mints
Bulk parameters need a key too. Over these limits the answer is the same 403, with param and max (only param for a parameter that needs a key at any value).
| Endpoint (GET) | Needs an API key when |
|---|---|
/tokens | limit above 100, or any cursor, from, to or creator |
/tokens/trending | limit above 100 |
/tokens-by-name | limit above 100 |
/tokens/{mint}/launch | limit above 150 |
/tokens/{mint}/candles | limit above 1,000 |
/tokens/{mint}/ticks | limit above 2,000 |
/tokens/{mint}/swaps | limit above 200 |
/tokens/{mint}/holders | limit above 100 |
/wallets/{addr}/positions | limit above 100 |
/wallets/{addr}/transfers | limit above 100 |
/wallets/{addr}/created | limit above 100 |
/wallets/{addr}/related | limit above 60 |
/cross | more than 40 mints or more than 120 wallets |
/creators | limit above 100 |
/leaders | past above 40 or future above 160 |
Sign-in and scraping limits
- Sniper VS. Comparing wallets on Sniper VS (
/versus) needs a signed-in wallet (401login_requiredotherwise). - Hourly data limit. Heavy scraping without a key runs into an hourly data limit per address (
429hourly_volume_limitwithRetry-After).
Backtests and live simulations
Backtests and live simulations are free with a signed-in wallet: no credits used.
- One running backtest and one running live simulation per account. Starting another answers 409 with the running job’s
idandstatusalready_running. - Server capacity. When every live-simulation slot on the server is taken, starting one answers
503heavy_capacitywithRetry-After.