BO3 API endpoint
Returns a CS2 team's newest matches (up to 30) with, for every match, the opponent, the tournament, the rounds played, each map played in order and every player's line (rating, kills, deaths, assists, damage, first kills and deaths, trade kills and deaths, headshots, hits, shots, accuracy, money saved and equipment value). Filter by `opponent` for head-to-head history or by `tournament` for one event. Date windows are not supported upstream; the newest matches come first and the list does not page past 30.
/bo3/team-recent-matchesHeader: x-api-key required.
Parameters:
slug: required team slug, for example vitality.opponent: optional opposing team slug, for example natus-vincere; only matches against that team are returned.tournament: optional tournament slug from bo3-tournaments; only that event's matches are returned.limit: optional number of newest matches, 1 to 30, default 10.Notable response behavior:
subject is team here (allowed values: team, player) and player on bo3-player-recent-matches. Matches are newest first. There is no date window and no paging: the upstream ignores date filters and never returns more than 30 matches, so use opponent and tournament to reach older history.maps lists each map of the match in order with game_number, game_id and map. lines holds one row per player with rating, kills, deaths, assists, damage, first_kills, first_deaths, trade_kills, trade_deaths, headshots, hits, shots, accuracy, headshot_ratio, multikills, money_saved, equipment_value and avg_kill_cost; the values are totals over the maps of the match.404. A filter that matches nothing returns an empty matches list. Cached for up to ten minutes.| Field | Filled in, of 30 checked | Values in the sample |
|---|---|---|
| match_slug | 30 | |
| started_at | 30 | 2026-06-14 to 2026-10-29 |
| tournament_slug | 30 | |
| opponent | 30 | |
| rounds | 30 | 17 to 78, median 45 |
| maps | 30 | median 2 entries |
| lines | 30 | median 5 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| slug | string | Yes | Team slug, for example vitality | vitality | |
| opponent | string | No | Opposing team slug for head-to-head matches, for example natus-vincere | ||
| tournament | string | No | Tournament slug from bo3-tournaments | ||
| limit | integer | No | Newest matches to return, 1 to 30, default 10 Minimum: 1. Maximum: 30. |
curl -X GET "https://api.crawlora.net/api/v1/bo3/team-recent-matches?slug=vitality&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.bo3.gg/api/v1/teams/vitality/matches_list_stats/general",
"fetched_at": "2026-10-28T10:00:00Z",
"subject": "team",
"slug": "vitality",
"count": 1,
"matches": [
{
"match_slug": "vitality-vs-natus-vincere-27-10-2026",
"started_at": "2026-10-27T17:55:00Z",
"tournament_slug": "pgl-masters-bucharest-2026",
"opponent": {
"id": 787,
"slug": "natus-vincere",
"name": "Natus Vincere"
},
"rounds": 37,
"maps": [
{
"game_number": 1,
"game_id": 190594,
"map": "de_dust2"
}
],
"lines": [
{
"player_slug": "zywoo",
"nickname": "ZywOo",
"team_slug": "vitality",
"rating": 7.42,
"kills": 32,
"deaths": 23,
"assists": 13,
"damage": 3526
}
]
}
]
}
}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.RecentMatchesResponse | No | ||||
| data.count | integer | No | 10 | |||
| data.fetched_at | string | No | 2026-10-28T10:00:00Z | |||
| data.matches | array | No | ||||
| data.matches[].lines | array | No | ||||
| data.matches[].lines[].accuracy | number | No | ||||
| data.matches[].lines[].assists | integer | No | 13 | |||
| data.matches[].lines[].avg_kill_cost | number | No | ||||
| data.matches[].lines[].damage | integer | No | 3526 | |||
| data.matches[].lines[].deaths | integer | No | 23 | |||
| data.matches[].lines[].equipment_value | integer | No | 200950 | |||
| data.matches[].lines[].first_deaths | integer | No | 2 | |||
| data.matches[].lines[].first_kills | integer | No | 10 | |||
| data.matches[].lines[].headshot_ratio | number | No | ||||
| data.matches[].lines[].headshots | integer | No | 15 | |||
| data.matches[].lines[].hits | integer | No | 78 | |||
| data.matches[].lines[].kills | integer | No | 32 | |||
| data.matches[].lines[].money_saved | integer | No | 81700 | |||
| data.matches[].lines[].multikills | number | No | ||||
| data.matches[].lines[].nickname | string | No | ZywOo | |||
| data.matches[].lines[].player_slug | string | No | zywoo | |||
| data.matches[].lines[].rating | number | No | ||||
| data.matches[].lines[].shots | integer | No | 371 | |||
| data.matches[].lines[].team_slug | string | No | vitality | |||
| data.matches[].lines[].trade_deaths | integer | No | 6 | |||
| data.matches[].lines[].trade_kills | integer | No | 4 | |||
| data.matches[].maps | array | No | ||||
| data.matches[].maps[].game_id | integer | No | 190587 | |||
| data.matches[].maps[].game_number | integer | No | 1 | |||
| data.matches[].maps[].map | string | No | de_dust2 | |||
| data.matches[].maps[].won | boolean | No | ||||
| data.matches[].match_slug | string | No | vitality-vs-natus-vincere-27-10-2026 | |||
| data.matches[].opponent | bo3.TeamRef | No | ||||
| data.matches[].opponent.id | integer | No | 654 | |||
| data.matches[].opponent.name | string | No | Spirit | |||
| data.matches[].opponent.slug | string | No | spirit | |||
| data.matches[].rounds | integer | No | 37 | |||
| data.matches[].started_at | string | No | 2026-10-27T17:55:00Z | |||
| data.matches[].tournament_slug | string | No | pgl-masters-bucharest-2026 | |||
| data.opponent | string | No | ||||
| data.slug | string | No | vitality | |||
| data.source_url | string | No | https://bo3.gg/matches/current | |||
| data.subject | string | No | team, player | team | ||
| data.tournament | string | 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 |
| 404 | Not Found | #/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/team-recent-matches?slug=vitality&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"