API documentation built for one clean request.
https://api.cord.catIntroduction
The CordCat API lets you programmatically query Discord user profiles, breach data, EU DSA sanctions, and FiveM records. The API is JSON-only and requires an API key for external access.
Note
The site itself uses the API internally without a key (IP rate-limited). External applications must include an API key header.
Authentication
Pass your API key in one of two ways.
# Header (recommended)
X-API-Key: cc_your_api_key_here
# Or via Authorization
Authorization: Bearer cc_your_api_key_hereGet your API key by creating an account and visiting the Dashboard.
Rate limits
No key (site)
10 req/minFree plan
60 req/hourUnlimited plan
No limitRate limit headers are included in every response: X-RateLimit-Remaining, X-RateLimit-Reset.
Endpoints
/api/v2/query/:discord_idAPI keyFull lookup: Discord profile, dataset exposure (with GeoIP/ASN), FiveM records, EU DSA sanctions, and a transparent risk/bot score.
Path parameters
| Parameter | Type | Description |
|---|---|---|
discord_id | string | 17 to 20 digit Discord snowflake ID. Required. |
Query parameters
| Parameter | Type | Description |
|---|---|---|
refresh | boolean | Optional. Set to 1 to bypass the result cache, re-fetch, and return meta.changes (the diff since the last snapshot). |
Caching & extras
Results are cached for ~10 minutes. Each response also carries a score (risk + bot likelihood) and a meta block with the cache state and any changes since the previous lookup.
Response
/api/user/batchAccount sessionResolve up to 100 Discord IDs in one call. Requires a logged-in account session (cookie + CSRF), not an API key. Throttled to ~10 IDs/sec, capped at 5 runs per 10 minutes.
Body (JSON)
| Field | Type | Description |
|---|---|---|
ids | string[] | Up to 100 Discord IDs. A newline- or comma-separated string is also accepted. |
Response
Saved batch maps
Account sessionPersist a batch result set to your account and reload it later (max 25 per account).
/api/user/batch-mapsList all saved maps for the authenticated user. Returns map metadata (IDs omitted for brevity).
Response
{
"maps": [
{
"id": 1,
"name": "My investigation",
"count": 42,
"created_at": "2026-06-01T12:00:00.000Z",
"updated_at": "2026-06-01T12:00:00.000Z"
}
]
}/api/user/batch-mapsSave a batch result set under a name. Body must be JSON.
Body (JSON)
| Field | Type | Description |
|---|---|---|
name | string | Display name for the map (max 80 chars). Required. |
ids | string[] | Array of Discord snowflake IDs (max 100). Required. |
results | BatchSummary[] | null | Optional cached result summaries from the batch endpoint. |
Response 201 Created
{ "id": 7 }/api/user/batch-maps/:idFetch a single saved map including the full ID list and cached results.
Response
{
"id": 7,
"name": "My investigation",
"ids": ["123456789012345678", "..."],
"results": [ { "ok": true, "id": "123456789012345678", "username": "example", "risk": 23, "riskLevel": "low", "botLevel": "unlikely", "breachCount": 1, "fivemTotal": 0, "sanctions": 0 } ],
"created_at": "2026-06-01T12:00:00.000Z",
"updated_at": "2026-06-01T12:00:00.000Z"
}/api/user/batch-maps/:idPermanently delete a saved map. Only the owner can delete their own maps.
Response
{ "ok": true }/api/statusReturns the current health status of all services.
Tools API
Free to use on the website with a captcha. Direct API access (bypassing the captcha) requires an API key. Base URL: https://api.cord.cat
/api/tools/user/:idFetch basic Discord user info (avatar, banner) by snowflake ID. Lighter than /v2/query — no breach or FiveM data.
| Field | Type | Description |
|---|---|---|
id | string | Discord snowflake ID (17-20 digits) |
username | string | Discord username |
global_name | string | null | Display name |
avatar | string | null | Avatar hash. Prefix a_ = animated GIF available. |
banner | string | null | Banner hash |
accent_color | number | null | Profile accent color as integer |
Avatar CDN URL
https://cdn.discordapp.com/avatars/{id}/{hash}.png?size=1024/api/tools/invite/:codeValidate a Discord invite and return full guild and channel metadata.
{
"code": "intelxfr",
"guild": { "id": "...", "name": "IntelX", "icon": "...", "features": [...] },
"channel": { "id": "...", "name": "events", "type": 0 },
"inviter": { "id": "...", "username": "user" },
"approximate_member_count": 1430,
"approximate_presence_count": 248,
"expires_at": null
}/api/tools/guild-widget/:idProxies Discord's public widget JSON for a server. The server must have its widget enabled (Server Settings → Widget). Returns 403 if widget is disabled.
{
"id": "...",
"name": "Server Name",
"instant_invite": "https://discord.gg/...",
"presence_count": 248,
"channels": [ { "id": "...", "name": "General", "position": 0 } ],
"members": [
{
"id": "...",
"username": "Wojak",
"status": "online",
"avatar_url": "https://cdn.discordapp.com/widget-avatars/...",
"activity": { "name": "League of Legends" }
}
]
}Browser-side tools
These tools run entirely in your browser — no API call required. They are accessible at cord.cat/tools.
Snowflake Decoder — /tools/snowflake
Decodes any Discord (or Twitter) snowflake ID client-side. Returns creation timestamp (UTC), internal worker ID, process ID, and increment. No network request.
Time Converter — /tools/time
Converts any date or Unix timestamp to every Discord timestamp markdown format (<t:unix:R>, <t:unix:F>, etc.) and displays the equivalent in every major timezone.
Webhook Sender — /tools/webhook
GUI for building and sending Discord messages directly to a webhook URL. Supports plain content, embeds (title, description, fields, footer, author, color), username override, and avatar override. Calls the Discord webhook URL directly from the browser — no server-side proxy.
Embed Builder → Code — /tools/embed-builder
Visual Discord embed designer with a live preview. Export the embed as discord.js, discord.py, or raw JSON payload. Runs fully client-side.
Gateway Intent Calculator — /tools/intents
Select Discord gateway intents from a checklist and compute the combined bitfield integer. Also decodes an existing integer back to its constituent intents. Use the value directly in your bot's intents config.
Response schema
Every field returned by the query endpoint, with its type.
| Field | Type | Description |
|---|---|---|
userInfo | object | null | Discord profile, or null if the user was not found. |
userInfo.username | string | Discord username. |
userInfo.global_name | string | null | Display name, if set. |
userInfo.public_flags | integer | Badge bitmask, decode for public flags. |
breach.resultsCount | integer | Number of dataset matches. |
breach.data.results | array | Dataset records, each with its source and raw fields. |
breach.data.ipGeo | object | GeoIP/ASN enrichment keyed by IP: { asn, organization, country }. |
fivem.data.total | integer | Total FiveM records found. |
statements | array | EU DSA statements, empty if none. |
score.risk | integer | Risk score 0-100, summed from explainable signals. |
score.level | string | low | elevated | high. |
score.signals | array | Each contributing signal: { key, label, detail, points }. |
score.bot.level | string | Bot likelihood: unlikely | possible | likely | definite. |
meta.cached | boolean | Whether this response was served from cache. |
meta.changes | array | Fields that changed since the previous snapshot (with ?refresh=1). |
Errors
| Code | Meaning |
|---|---|
400 | Invalid Discord ID format |
401 | Missing or invalid API key |
404 | Discord user not found |
429 | Rate limit exceeded |
500 | Internal server error |
502 | Upstream Discord API error |
Examples
The same request, in your language of choice.
curl -H "X-API-Key: cc_your_key" \
https://api.cord.cat/api/v2/query/123456789012345678