API overview
Auth, base URL, pagination, rate limits, error shape, and the endpoint groups that make up the CrowdIntel REST surface.
Everything the terminal reads is a REST endpoint you can call yourself. This page covers the conventions that hold across all of them — auth, pagination, limits, errors — and points at the group you need. For request and response schemas endpoint by endpoint, use the API reference.
Base URL and auth
https://crowdintel.xyz/api/v1Every endpoint takes a bearer token. Mint one at
Settings → API — free, no card. Keys are prefixed cint_api_
and shown once at creation.
Authorization: Bearer cint_api_your_key_hereEvery endpoint has a minimum tier of free, so a free key reaches all 41 of
them and no endpoint answers a valid free key with a 403. What a paid tier buys
is throughput and depth: more calls per hour, more rows per ranking (the screener
pages to 25 rows on free and 1,000 on Terminal Pro), more backtest runs, more
webhook endpoints, and the full wallet dossier rather than the lite profile.
Conventions
- JSON in, JSON out. Response keys are
snake_casethroughout. - Timestamps are ISO 8601 strings in UTC.
- Addresses are lowercase
0x-prefixed hex. - Collections return
{ data, next_cursor }with any per-request context as siblings ofdata.GET /api/v1/webhooksis the one exception still on an older shape — it returns{ webhooks: [...] }and does not paginate. - Money is USDC as a JSON number. Prices are decimals in
0..1, not cents. - Single-object reads — a wallet, a market, a backtest job — return the object directly, with no envelope around it.
Pagination
List endpoints are cursor-paginated. Read next_cursor from a page and pass it
back as cursor to get the following one; null means there are no more pages.
Cursors are opaque — do not parse or construct them.
# first page
curl -G "https://crowdintel.xyz/api/v1/trades" \
-H "Authorization: Bearer $CROWDINTEL_KEY" \
--data-urlencode "limit=100"
# next page
curl -G "https://crowdintel.xyz/api/v1/trades" \
-H "Authorization: Bearer $CROWDINTEL_KEY" \
--data-urlencode "limit=100" \
--data-urlencode "cursor=eyJ2Ijo..."A cursor is bound to the query that issued it. Replaying one against different
filters returns 400 rather than a silently different page, so keep the rest of
the query string identical while paging.
Errors
Failures use one envelope. Branch on error.code — the message is for humans
and may change.
{
"error": {
"code": "forbidden",
"message": "Free tier allows 1 webhook endpoint. Terminal ($99) allows 10 — https://crowdintel.xyz/pricing",
"request_id": "b9f1e0c4-..."
}
}| Code | Status | Meaning |
|---|---|---|
unauthorized | 401 | Missing, invalid or revoked token. |
forbidden | 403 | Token is valid, but an allowance on your plan is exhausted. |
rate_limited | 429 | Over the hourly or monthly call cap, or over your monthly backtest allowance. |
not_found | 404 | No such wallet, market, cluster or job. Also returned for a job that belongs to someone else. |
bad_request | 400 | Malformed parameter, unsortable sort key, or a cursor that does not match the query. |
internal_error | 500 | Our fault. Quote request_id to support. Also used with 503 when the backtest queue is saturated. |
request_id is also returned in the X-Request-Id header, and it is what we
search on — include it in any bug report.
Rate limits
Two rolling windows are enforced on every call, hourly and monthly. Whichever is closer to its cap is the binding one, and it is the one the headers describe.
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Cap of the binding window. |
X-RateLimit-Remaining | Calls left in that window. |
X-RateLimit-Reset | Unix seconds when that window rolls. |
Retry-After | Seconds to wait. Present on 429 only. |
| Tier | Per hour | Per month | Backtest runs | Webhook endpoints |
|---|---|---|---|---|
| Free — $0 | 50 | 500 | 3 / month, 1 concurrent | 1 |
| Terminal — $99/mo | 1,000 | 50,000 | uncapped, 3 concurrent | 10 |
| Terminal Pro — $299/mo | 5,000 | 250,000 | uncapped, 3 concurrent | 10 |
Read X-RateLimit-Remaining instead of backing off blindly — it already accounts
for whichever cap you will hit first. Pro ($29/mo) is a terminal plan: it raises
your MCP allowance to 50 calls a day and keeps the free REST limits, so pick
Terminal if what you need is REST volume. The full ladder is on
pricing.
Endpoint groups
All 41 endpoints, grouped. Follow a link for the schemas.
| Group | Endpoints | What it serves |
|---|---|---|
| Screener | 1 | The ranked wallet board with the same state codec as the UI. See Screener. |
| Wallets | 7 | Dossier, category breakdown, entry timing, correlated wallets, funding connections, fill history, search. |
| Signals | 4 | Per-wallet and per-market signal reads, the edge screen, and movers. |
| Leaderboards | 3 | Whales, PnL, and per-category boards. |
| Cohorts | 2 | The cohort registry and one cohort's ranked members. See Cohorts and lists. |
| Markets | 8 | List and search, detail, sentiment, flow, 1-minute candles, per-market TWAP, trending, moving. |
| Trades | 2 | The raw fill tape and a lookup by transaction hash. |
| Clusters | 3 | A cluster by id, the funding graph around a funder, and the sybil screen. |
| Investigations | 2 | Published investigations, list and detail. |
| Backtests | 2 | Enqueue a signal replay and poll it. See Backtests. |
| Webhooks | 2 | Create, list and delete delivery endpoints. See Webhooks. |
| Crypto TWAP | 2 | The Chainlink settlement series and its coverage. See TWAP settlement feed. |
| Analyze | 1 | A composed read for one market. |
| Status | 1 | Nightly PnL parity against Polymarket's own profit API. |
| Ping | 1 | Key check — returns the tier the key resolved to. |
Two worth knowing about
GET /api/v1/screener is the screener itself, not a summary of it. It shares the
state codec with the UI, so a link someone pastes you and a call your bot makes
encode the same screen.
GET /api/v1/crypto/twap is the Chainlink series Polymarket settles crypto
up/down markets against. The upstream feed is live-stream only — there is no
history endpoint anywhere, so an hour nobody recorded is gone. We started
recording when the settlement rule changed on 2026-08-07.
Checking a key
GET /api/v1/ping is the cheapest way to tell a bad key from a bad query. It
returns the tier the key resolved to.
curl https://crowdintel.xyz/api/v1/ping \
-H "Authorization: Bearer $CROWDINTEL_KEY"Next
- Quickstart — key to first response in about five minutes.
- Webhooks — get pushed to instead of polling.
