BO3 API endpoint
Returns BO3.gg's CS2 records (standout single-game and single-round performances such as best shots accuracy, clutches, multikills, damage, win streaks) with paging. Scope them to one `match`, `tournament`, `team` or `player` slug, filter by `record_type` (for example `game_player_headshots`), restrict the game day range with `from`/`to`, and order `newest` or `oldest`. Unscoped requests cover the last six months; each record has its value, unit, side, map, round, player, team and opponents.
/bo3/recordsHeader: x-api-key required.
Parameters:
from, to: optional days as YYYY-MM-DD (UTC). An unscoped request defaults to the six months ending today; a request scoped to a match, tournament, team or player covers all time unless you pass them.record_type: optional record type. The set is open (BO3.gg has no list endpoint for it) and an unknown type returns an empty list, so only the shape game_<name> is checked. Types seen in samples include game_player_shots_accuracy, game_player_headshots, game_player_avg_kills, game_player_avg_damage, game_round_player_clutch, game_round_player_ace, game_round_player_multikills, game_round_player_damage, game_round_team_eco_vs_buy, game_team_win_streak and per-weapon kills and damage such as game_player_avg_m4a4_kills; each response lists the types it contains.match, tournament, team, player: optional slugs; they can be combined.sort: optional; allowed values: newest, oldest. Defaults to newest.offset: optional zero-based offset; limit: optional page size, 1 to 100, default 20.Notable response behavior:
total counts the records that fit the filters (about 200,000 for the default six months) and has_more says whether another page exists. side is CT or T on round records and empty on game records; unit is % or s where the value has one.record_type, the four slugs, the day range and the sort filter the list; BO3.gg ignores side and unit filters, so none is offered. An invalid slug, record type shape, sort, date or page size returns 400. The response is cached for up to one hour.| Field | Filled in, of 19 checked | Values in the sample |
|---|---|---|
| type | 19 | game_player_headshots in all 19 |
| value | 19 | 22 to 29, median 23 |
| average | 19 | 7.79 to 8.19, median 8.18 |
| map | 19 | nuke (6), mirage (4), ancient (3) and 4 more |
| begin_at | 19 | 2022-07-26 to 2026-10-27 |
| player | 19 | |
| team_name | 19 | Spirit (11), Spirit Academy (8) |
| country_code | 19 | |
| match_slug | 19 | |
| opponents | 19 | median 2 entries |
| series | 19 | “PGL” and 10 other values |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| from | string | No | First day, YYYY-MM-DD (UTC); unscoped default is six months before to | 2026-04-28 | |
| to | string | No | Last day, YYYY-MM-DD (UTC); unscoped default is today | 2026-10-28 | |
| record_type | string | No | Record type such as game_player_headshots or game_round_player_clutch; the types present are listed in the response | ||
| match | string | No | Match slug to scope the records to one match | vitality-vs-natus-vincere-27-10-2026 | |
| tournament | string | No | Tournament slug to scope the records to one tournament | pgl-masters-bucharest-2026 | |
| team | string | No | Team slug to scope the records to one team | vitality | |
| player | string | No | Player slug to scope the records to one player | donk | |
| sort | string | No | newest | Order by game time; one of newest, oldest; defaults to newest Allowed values: newest, oldest. | |
| offset | integer | No | 0 | Zero-based offset; defaults to 0 Minimum: 0. | |
| limit | integer | No | 20 | Page size, 1 to 100; defaults to 20 Minimum: 1. Maximum: 100. |
curl -X GET "https://api.crawlora.net/api/v1/bo3/records?sort=newest&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.bo3.gg/api/v1/records",
"fetched_at": "2026-10-28T10:00:00Z",
"from": "2026-04-28",
"to": "2026-10-28",
"total": 201433,
"offset": 0,
"limit": 20,
"count": 1,
"has_more": true,
"types": [
"game_player_shots_accuracy"
],
"items": [
{
"type": "game_player_shots_accuracy",
"value": 0.41,
"average": 0.18,
"unit": "%",
"map": "anubis",
"begin_at": "2026-10-27T20:16:26Z",
"player": {
"id": 30006,
"slug": "nqz",
"nickname": "nqz"
},
"team_name": "MIBR",
"match_slug": "mibr-vs-eternal-fire-27-10-2026",
"opponents": [
"MIBR",
"Eternal Fire"
]
}
]
}
}Request schema
No body schema
Response schema
Inline response schema
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | bo3.RecordsFeedResponse | No | ||||
| data.count | integer | No | 20 | |||
| data.fetched_at | string | No | 2026-10-28T10:00:00Z | |||
| data.from | string | No | 2026-04-28 | |||
| data.has_more | boolean | No | true | |||
| data.items | array | No | ||||
| data.items[].average | number | No | 0.18 | |||
| data.items[].begin_at | string | No | ||||
| data.items[].country_code | string | No | BR | |||
| data.items[].detail | string | No | win | |||
| data.items[].map | string | No | anubis | |||
| data.items[].match_slug | string | No | mibr-vs-eternal-fire-27-10-2026 | |||
| data.items[].opponents | array | No | ||||
| data.items[].player | bo3.PersonRef | No | ||||
| data.items[].player.id | integer | No | 14 | |||
| data.items[].player.nickname | string | No | Pers1valle | |||
| data.items[].player.slug | string | No | pers1valle | |||
| data.items[].round_number | integer | No | 7 | |||
| data.items[].series | string | No | Stake Ranked | |||
| data.items[].side | string | No | CT, T | T | ||
| data.items[].team_name | string | No | MIBR | |||
| data.items[].type | string | No | game_player_shots_accuracy | |||
| data.items[].unit | string | No | % | |||
| data.items[].value | number | No | 0.41 | |||
| data.limit | integer | No | 20 | |||
| data.offset | integer | No | 0 | |||
| data.source_url | string | No | https://bo3.gg/matches/current | |||
| data.to | string | No | 2026-10-28 | |||
| data.total | integer | No | 201433 | |||
| data.types | array | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/bo3/records?sort=newest&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"