# Plans, limits & credits

> Crius API plans (Free, Starter, Pro, Business, Enterprise), monthly credits, requests per second, WebSocket limits, credit cost per endpoint and the rate-limit response headers.

Source: https://docs.crius.sh/plans-and-limits/ · Updated 2026-10-28

Every plan has a **rate limit** (requests per second, with a burst of twice that), a **monthly credit quota**, WebSocket limits and a set of endpoints. Each request costs a number of **credits** depending on the endpoint; cheap calls such as prices cost 1.

**How the rate limit works:** each key (or, without a key, each IP address) has a bucket that holds up to twice its per-second limit and refills at that limit. A Free key (10 requests/s) can send 20 requests at once, then 10 every second. The Account API has its own limit and is never counted.

**Getting a key or a bigger plan:** a Free key takes a minute at [dashboard.crius.sh](https://dashboard.crius.sh) (email or wallet, no card). Upgrades are on the dashboard’s [Billing page](https://dashboard.crius.sh/billing); for more than Business, write to [support@crius.sh](mailto:support@crius.sh).

## Plans

| Plan | Price | Credits / month | Requests / s | WebSockets | Subscriptions |
| --- | --- | --- | --- | --- | --- |
| Anonymous (no key) | free | n/a, per IP | 2 | none | none |
| **Free** | $0 | 1,000,000 | 10 | 1 | 10 |
| **Starter** | $19 / month | 10,000,000 | 25 | 3 | 100 |
| **Pro** | $79 / month | 50,000,000 | 75 | 10 | 1,000 |
| **Business** | $249 / month | 200,000,000 | 200 | 50 | 10,000 |
| **Enterprise** | custom | custom | custom | custom | custom |

Paying for 6 months gives 10% off, and 12 months 20% off. Plans are paid on-chain on Robinhood Chain in USDG, ETH or WETH; see [Billing & payments](https://docs.crius.sh/reference/billing/). Credits reset at the start of each UTC month and are shared by all of an account’s keys.

## Endpoints by plan

| Plan needed | Endpoints | Credits per call |
| --- | --- | --- |
| Anonymous | token profile, price, batch prices, batch profiles, pools, pool, token lists, search, stats, volume, launchpads, security (cached) | 1 |
| Anonymous | trades, candles, launchpad detail | 2 |
| Public | status, chains | 0 (not counted against any limit) |
| Free | holders, launch, activity feed, hooks, hook detail | 2 |
| Free | holder snapshot, top traders, liquidity & locks, developer profile | 5 |
| Free | WebSocket stream (per connection) | 1 |
| Starter | wallet profile, wallet trades, fees & claims | 5 |
| Starter | holder cohort, holder history, bundles, bubble map, wallet connections | 10 |
| Starter | fresh security simulation (`/security?fresh=1`) | 20 |
| Enterprise | `firehose:trades` stream channel (every trade on chain) |  |

Each endpoint page in the [API reference](https://docs.crius.sh/reference/tokens/) shows its plan and cost. Calls to the Account API (`/v1/account/*`) are **free** and don’t count against your credits.

## Rate-limit headers

Every data response carries:

| Header | Meaning |
| --- | --- |
| `x-ratelimit-limit` | Your requests-per-second limit for this key |
| `x-ratelimit-remaining` | Requests left in the current burst |
| `x-ratelimit-reset` | Milliseconds until the bucket refills (1000) |
| `x-credits-cost` | Credits this request cost |
| `x-quota-remaining` | Credits left this month (after this request) |

When you go over the rate limit you get **`429 rate_limited`** with a `retry-after` header (seconds). When the month’s credits run out you get **`429 quota_exceeded`** until the next month, or until you upgrade. Both say what your limit is and how to raise it:

```json
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit reached: requests without an API key are limited to 2 per second per IP (bursts of up to 4). Retry in 1 s, or get a free API key (10 requests/s, 1,000,000 credits a month) at https://dashboard.crius.sh.",
    "plan": "anon",
    "limit_rps": 2,
    "burst": 4,
    "retry_after_ms": 412,
    "upgrade_url": "https://dashboard.crius.sh",
    "docs_url": "https://docs.crius.sh/plans-and-limits/"
  }
}
```

| Field | Meaning |
| --- | --- |
| `plan` | The plan the request was checked against (`anon` without a key) |
| `limit_rps`, `burst` | Your requests per second and the most you can send at once |
| `retry_after_ms` | When the next request will be accepted |
| `monthly_credits`, `resets` | (`quota_exceeded`) Your monthly credits and the UTC date they reset |
| `required_plan` | (`403 plan_required`) The lowest plan that includes the endpoint |
| `upgrade_url` | Where to get a key or a bigger plan |

## Handling 429 well

```js
async function crius(path, tries = 4) {
  for (let i = 0; i < tries; i++) {
    const res = await fetch(`https://api.crius.sh${path}`, {
      headers: { "x-api-key": process.env.CRIUS_API_KEY },
    });
    if (res.status !== 429) return res.json();
    const body = await res.json();
    if (body.error?.code === "quota_exceeded") throw new Error("monthly credits used up");
    const wait = Number(res.headers.get("retry-after") ?? 1) * 1000;
    await new Promise((r) => setTimeout(r, wait + Math.random() * 250));
  }
  throw new Error("still rate limited");
}
```

Save credits

Use batch endpoints (`/prices` and `/tokens/batch` take up to 100 tokens per call), use the WebSocket stream instead of polling, and cache responses for the time you can tolerate: `meta.block` tells you whether anything changed.

## Usage and alerts

The dashboard shows usage per day and per endpoint, and `GET /v1/account/usage` returns the same data. We email you when you reach 50%, 80%, 90% and 100% of your monthly credits.
