Authentication & API keys
How to authenticate Crius API requests with the x-api-key header, key scopes, IP allow-lists, browser origins, expiry, rotation with a grace period, and dashboard sessions.
Send your API key in the x-api-key header on every request:
curl "https://api.crius.sh/v1/robinhood/stats" -H "x-api-key: $CRIUS_API_KEY"WebSocket clients that can’t set headers may pass it as a query parameter instead: wss://api.crius.sh/v1/robinhood/stream?api_key=….
Requests without a key are allowed for the core endpoints (prices, tokens, pools, trades, candles, search, stats) under the anonymous plan: 2 requests per second per client IP, read-only. Everything else needs a key.
Key format
Keys look like crs_live_AbCd1234_<secret>:
crsidentifies a Crius key (handy for secret scanners);liveortestis the key’s environment label;AbCd1234is the public prefix shown in your dashboard and in emails;- the rest is the secret. It is shown once when the key is created. We store only a salted SHA-256 hash, so a lost key can’t be recovered: rotate it.
An account can have up to 20 active keys. Credits and plan limits belong to the account and are shared by all its keys.
Scopes
| Scope | Allows |
|---|---|
read |
All REST data endpoints your plan includes |
stream |
The WebSocket stream (also implies read) |
simulate |
Fresh on-demand security simulations (/security?fresh=1) |
export |
Bulk exports (reserved) |
The key issued when you sign up has read, stream and simulate; keys you create get read and stream unless you choose otherwise. Account management (keys, wallets, billing) is never possible with an API key: it needs a signed-in dashboard session, so a leaked key can read data but can’t take over your account.
Restricting a key
Every key can be narrowed in the dashboard or through the Account API:
- IP allow-list: one or more IPs or CIDR ranges (
203.0.113.7,10.0.0.0/8, IPv6 too). Requests from anywhere else get403 ip_not_allowed. - Allowed origins: browser origins such as
https://app.example.com. A key with origins becomes read-only and only works from those pages (403 origin_not_allowedotherwise). Use this for keys that must live in front-end code. - Rate limit: a per-key requests-per-second cap below your plan’s limit, so one service can’t starve another.
- Expiry: the key stops working after a number of days (
401 key_expired).
Rotating a key
Rotation issues a new secret and keeps the old one working for a grace period (1 hour by default, up to 7 days) so you can deploy the new key without downtime. After the grace period the old key returns 401 key_rotated. Revoking a key stops it immediately (401 key_revoked), on every region within seconds.
Dashboard sessions
Signing in at dashboard.crius.sh (email code or a linked wallet) creates a session key that lasts 7 days. Session keys can only call the Account API; using one on a data endpoint returns 403 session_not_api_key. API keys calling account-management endpoints get 403 session_required.
Failed authentication
Invalid keys get 401 invalid_key. After 20 failed attempts in a minute from one IP, that IP is blocked for 60 seconds (429 auth_banned).
Get your free Crius API key
Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.
- Robinhood Chain (4663) only, from our own archive nodes
- REST + WebSocket
- Pay on-chain or by card