Quickstart
Mint a free API key, make your first call, and receive your first webhook. About five minutes, no card required.
Three steps: get a key, call an endpoint, receive a webhook. Everything here works on the free tier.
Step 1 — Mint a key
Open Settings → API and create a key. Keys are prefixed
cint_api_ and are shown once, at creation — store it immediately.
Authenticate with a bearer token on every request:
Authorization: Bearer cint_api_your_key_hereConfirm the key resolves before you touch a data endpoint. /ping returns the
tier the key resolved to, which is the fastest way to tell a bad key from a bad
query:
curl https://crowdintel.xyz/api/v1/ping \
-H "Authorization: Bearer $CROWDINTEL_KEY"{ "ok": true, "tier": "free", "ts": "2026-08-16T09:12:44.108Z" }Step 2 — Call your first endpoint
GET /api/v1/wallets/{address} returns a wallet's profile and lifetime stats.
Grab an address from the screener — every row links to a wallet —
and pass it in the path.
curl "https://crowdintel.xyz/api/v1/wallets/$WALLET" \
-H "Authorization: Bearer $CROWDINTEL_KEY"Responses are JSON with snake_case keys. The free tier returns the lightweight profile — identity plus lifetime stats:
{
"address": "0x...",
"stats": {
"total_volume": 1284310.44,
"total_bets": 612,
"markets_traded": 188,
"first_seen": null,
"last_seen": "2026-08-15T22:41:03.000Z"
},
"wallet_stats": { "...": "full scoring row" },
"trades": [],
"alerts": []
}Terminal and above return the full dossier on the same URL: recent trades, alerts, and the funding cluster are populated rather than empty.
Errors and rate limits
Failures use one envelope, so you can branch on error.code rather than parsing
prose:
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key",
"request_id": "req_..."
}
}Codes are unauthorized, forbidden, rate_limited, not_found,
bad_request and internal_error. Every response carries X-RateLimit-Limit,
X-RateLimit-Remaining and X-RateLimit-Reset (unix seconds); a 429 adds
Retry-After. Read the remaining count rather than backing off blindly — it
reflects whichever cap you will hit first, hourly or monthly.
The full endpoint list, with request and response schemas, is in the API reference.
Step 3 — Receive your first webhook
Polling wastes your rate limit on markets where nothing happened. Webhooks push a signed payload the moment an alert fires on a wallet you follow.
- Follow at least one wallet — any dossier has a Follow button, or follow a whole list.
- Create an endpoint at Settings → Webhooks. The signing
secret is prefixed
whsec_and, like your API key, is shown once. - Verify the signature on every delivery before trusting the body.
Each delivery carries X-CrowdIntel-Signature (HMAC-SHA256, hex) and
X-CrowdIntel-Timestamp. Sign the raw body prefixed with the timestamp and a
dot, and compare in constant time:
import crypto from "node:crypto";
export function verify(rawBody, signature, timestamp, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
return (
signature.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
);
}Use the Test button on the settings page to send a sample delivery and prove your verification works before a real alert depends on it. The payload schema, retry behaviour and replay-window guidance are in Webhooks.
Where to go next
- API reference — all 41 endpoints, request and response schemas.
- Webhooks — payload schema and signature verification in full.
- Methodology — what the scores mean and what they do not claim.
