VLR API endpoint
Returns one VLR.gg match: event and stage, exact UTC start time, status (`final`, `live`, `upcoming`), format such as `Bo3`, both teams with series score, the pick/ban note, and every map with picker, round scores split into attack, defend and overtime, duration and per-player lines (agents, rating, ACS, K/D/A, KAST, ADR, headshot percent, first kills and deaths). `all_maps_players` holds the aggregate across maps. Also returns the teams' head-to-head history and each team's recent results. Player fields are omitted when VLR has not published them yet. Use vlr-match-economy, vlr-match-performance and vlr-match-rounds for the economy, kill-matrix and round-by-round tabs.
/vlr/matchHeader: x-api-key required.
Parameters:
id: required numeric VLR match id from vlr-matches, vlr-results or vlr-event-matches.Notable response behavior:
status is the site's status note, for example final. start_time_utc is RFC 3339 UTC.picked_by, per-team score and rounds (attack, defend, overtime) and the players of both teams. Player stats such as rating, kast_percent or adr can be missing right after a match while VLR processes it.all_maps_players aggregates the same stats over every map. An unknown match id, or a numeric VLR id that belongs to a news article or forum thread instead of a match, returns 404.head_to_head lists the two teams' earlier meetings (team1, team2 are the head-to-head teams left to right; scores read left to right). head_to_head.matches[].winner has these values: team1, team2.past_matches gives each team's recent results in match-header order. past_matches[].matches[].result has these values: win, loss; score is team:opponent.| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| id | 10 | |
| name | 10 | “Hopedawn” and 9 other values |
| team | 10 | UR (5), VLG (5) |
| country_code | 10 | |
| agents | 10 | median 2 entries |
| acs | 10 | 157 to 226, median 204 |
| kills | 10 | 42 to 65, median 58 |
| deaths | 10 | 48 to 67, median 57 |
| assists | 10 | 12 to 43, median 17 |
| kd_diff | 10 | -16 to 12, median 1 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| id | string | Yes | Numeric VLR match id from vlr-matches, vlr-results or vlr-event-matches | 777956 |
curl -X GET "https://api.crawlora.net/api/v1/vlr/match?id=777956" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://www.vlr.gg/match",
"fetched_at": "2026-10-27T10:00:00Z",
"id": "777956",
"url": "https://www.vlr.gg/777956",
"event": {
"id": "3166",
"name": "VCT 2026: China Threshold",
"series": "Week 2: Round of 12"
},
"start_time_utc": "2026-10-27T05:00:00Z",
"status": "final",
"format": "Bo3",
"teams": [
{
"id": "21919",
"name": "Unsettled Resentment",
"score": 2,
"winner": true
},
{
"id": "23699",
"name": "Victory No Limits Gaming",
"score": 1,
"winner": false
}
],
"note": "UR ban Haven; VLG ban Split; UR pick Summit",
"maps": [
{
"id": "287476",
"number": 1,
"name": "Summit",
"picked_by": "Unsettled Resentment",
"teams": [
{
"name": "Unsettled Resentment",
"score": 17,
"rounds": {
"attack": 6,
"defend": 6,
"overtime": 5
}
},
{
"name": "Victory No Limits Gaming",
"score": 19
}
],
"players": [
{
"id": "66833",
"name": "Hopedawn",
"team": "UR",
"agents": [
"Harbor"
],
"acs": 297,
"kills": 36,
"deaths": 23,
"assists": 12,
"kd_diff": 13
}
]
}
]
}
}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 | vlr.MatchDetail | No | ||||
| data.all_maps_players | array | No | ||||
| data.all_maps_players[].acs | integer | No | 297 | |||
| data.all_maps_players[].adr | number | No | 178.3 | |||
| data.all_maps_players[].agents | array | No | Harbor | |||
| data.all_maps_players[].assists | integer | No | 12 | |||
| data.all_maps_players[].country_code | string | No | cn | |||
| data.all_maps_players[].deaths | integer | No | 23 | |||
| data.all_maps_players[].first_deaths | integer | No | 3 | |||
| data.all_maps_players[].first_kills | integer | No | 5 | |||
| data.all_maps_players[].fk_diff | integer | No | 2 | |||
| data.all_maps_players[].headshot_percent | number | No | 24 | |||
| data.all_maps_players[].id | string | No | 66833 | |||
| data.all_maps_players[].kast_percent | number | No | 72 | |||
| data.all_maps_players[].kd_diff | integer | No | 13 | |||
| data.all_maps_players[].kills | integer | No | 36 | |||
| data.all_maps_players[].name | string | No | Hopedawn | |||
| data.all_maps_players[].rating | number | No | 1.12 | |||
| data.all_maps_players[].team | string | No | UR | |||
| data.event | vlr.EventRef | No | ||||
| data.event.id | string | No | 3166 | |||
| data.event.name | string | No | VCT 2026: China Threshold | |||
| data.event.series | string | No | Week 2: Round of 12 | |||
| data.event.url | string | No | ||||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.format | string | No | Bo3 | |||
| data.head_to_head | vlr.HeadToHead | No | ||||
| data.head_to_head.matches | array | No | ||||
| data.head_to_head.matches[].date | string | No | 2026/10/16 | |||
| data.head_to_head.matches[].event | string | No | Champions 2026 | |||
| data.head_to_head.matches[].id | string | No | 754736 | |||
| data.head_to_head.matches[].stage | string | No | UBF | |||
| data.head_to_head.matches[].team1_score | integer | No | 2 | |||
| data.head_to_head.matches[].team2_score | integer | No | 1 | |||
| data.head_to_head.matches[].url | string | No | ||||
| data.head_to_head.matches[].winner | string | No | team1, team2 | team1 | team1/team2 are the head_to_head teams, left and right | |
| data.head_to_head.team1 | string | No | LOUD | |||
| data.head_to_head.team2 | string | No | Team Vitality | |||
| data.id | string | No | 777956 | |||
| data.maps | array | No | ||||
| data.maps[].duration | string | No | 41:12 | |||
| data.maps[].id | string | No | 287476 | |||
| data.maps[].name | string | No | Summit | |||
| data.maps[].number | integer | No | 1 | |||
| data.maps[].picked_by | string | No | Unsettled Resentment | |||
| data.maps[].players | array | No | ||||
| data.maps[].players[].acs | integer | No | 297 | |||
| data.maps[].players[].adr | number | No | 178.3 | |||
| data.maps[].players[].agents | array | No | Harbor | |||
| data.maps[].players[].assists | integer | No | 12 | |||
| data.maps[].players[].country_code | string | No | cn | |||
| data.maps[].players[].deaths | integer | No | 23 | |||
| data.maps[].players[].first_deaths | integer | No | 3 | |||
| data.maps[].players[].first_kills | integer | No | 5 | |||
| data.maps[].players[].fk_diff | integer | No | 2 | |||
| data.maps[].players[].headshot_percent | number | No | 24 | |||
| data.maps[].players[].id | string | No | 66833 | |||
| data.maps[].players[].kast_percent | number | No | 72 | |||
| data.maps[].players[].kd_diff | integer | No | 13 | |||
| data.maps[].players[].kills | integer | No | 36 | |||
| data.maps[].players[].name | string | No | Hopedawn | |||
| data.maps[].players[].rating | number | No | 1.12 | |||
| data.maps[].players[].team | string | No | UR | |||
| data.maps[].teams | array | No | ||||
| data.maps[].teams[].name | string | No | Unsettled Resentment | |||
| data.maps[].teams[].rounds | vlr.RoundSplit | No | ||||
| data.maps[].teams[].rounds.attack | integer | No | 6 | |||
| data.maps[].teams[].rounds.defend | integer | No | 6 | |||
| data.maps[].teams[].rounds.overtime | integer | No | 5 | |||
| data.maps[].teams[].score | integer | No | 17 | |||
| data.note | string | No | ||||
| data.past_matches | array | No | ||||
| data.past_matches[].matches | array | No | ||||
| data.past_matches[].matches[].date | string | No | 2026/10/16 | |||
| data.past_matches[].matches[].id | string | No | 754736 | |||
| data.past_matches[].matches[].opponent | string | No | Team Vitality | |||
| data.past_matches[].matches[].result | string | No | win, loss | win | ||
| data.past_matches[].matches[].score | string | No | 2:1 | |||
| data.past_matches[].matches[].url | string | No | ||||
| data.past_matches[].team | string | No | LOUD | |||
| data.source_url | string | No | https://www.vlr.gg/matches | |||
| data.start_time_utc | string | No | 2026-10-27T05:00:00Z | |||
| data.status | string | No | final | |||
| data.teams | array | No | ||||
| data.teams[].id | string | No | 21919 | |||
| data.teams[].logo_url | string | No | ||||
| data.teams[].name | string | No | Unsettled Resentment | |||
| data.teams[].score | integer | No | 2 | |||
| data.teams[].tag | string | No | UR | |||
| data.teams[].url | string | No | ||||
| data.teams[].winner | boolean | No | true | |||
| data.url | 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/vlr/match?id=777956" \
-H "x-api-key: $CRAWLORA_API_KEY"