VLR API endpoint
Returns VLR.gg's player statistics table (100 rows per page): agents played, maps, rounds, rating, ACS, K:D, KAST, ADR, KPR, APR, first-kill and clutch rates and totals. Filter with comma-separated `tier` (vct, vcl, t3, gc, cg, off), `region` (americas, emea, pacific, china, intl), `role` (controller, initiator, sentinel, duelist), `agent` and `map` names, plus `timespan` (all, 30d, 60d, 90d or a season year from 2020 up to the current year), `side` (all, t, ct), `min_rounds` and `min_rating`; sort with `sort` and `dir`.
/vlr/statsHeader: x-api-key required.
Parameters:
tier: optional comma-separated list; allowed values: vct, vcl, t3, gc, cg, off. The site default is vct.region: optional comma-separated list; allowed values: americas, emea, pacific, china, intl.timespan: optional; allowed values: all, 30d, 60d, 90d, 2026, 2025, 2024, 2023, 2022, 2021, 2020. The list of season years grows by one on 1 January (for example 2027 is accepted from 2027-01-01); any year before 2020 or after the current year returns 400. The site default is 60d.from and to: optional custom date range as YYYY-MM-DD days (UTC); send both, with from not after to, and do not combine them with timespan (that returns 400).side: optional; allowed values: all, t, ct (t attack, ct defend).role: optional comma-separated list; allowed values: controller, initiator, sentinel, duelist.agent: optional comma-separated list; allowed values: astra, brimstone, clove, harbor, miks, omen, viper, breach, fade, gekko, kayo, skye, sova, tejo, chamber, cypher, deadlock, killjoy, sage, veto, vyse, iso, jett, neon, phoenix, raze, reyna, waylay, yoru.map: optional comma-separated list; allowed values: abyss, bind, corrode, haven, lotus, summit, sunset, ascent, breeze, fracture, icebox, pearl, split.min_rounds: optional minimum rounds played, default 100 on the site.min_rating: optional; allowed values: 0, 1300, 1400, 1500, 1550, 1650, 1750, 1850.sort: optional column; allowed values: rating, maps, rnd, acs, kd, kast, adr, kpr, apr, fkfd, fkpr, fdpr, hsp, clp, cl, kmax, k, d, a, fk, fd. Default rating.dir: optional; allowed values: asc, desc. Default desc.page: optional 1-based page, default 1; each page has up to 100 players.Notable response behavior:
400 before VLR is contacted. Agent and map lists reflect the site's filter form on 2026-10-27 and can grow with new releases.kast_percent are numbers (76 means 76%). Missing values are omitted.player.team is the player's current team tag as shown on the table. The response is cached for up to ten minutes.| Field | Filled in, of 11 checked | Values in the sample |
|---|---|---|
| player | 11 | |
| agents | 11 | median 1 entry |
| agent_usage | 11 | median 1 entry |
| maps | 11 | 5 to 18, median 6 |
| rounds | 11 | 113 to 380, median 141 |
| rating | 10 | 0.79 to 1.29, median 1.01 |
| acs | 11 | 175 to 276, median 235 |
| kd | 11 | 0.88 to 1.47, median 1.12 |
| kast_percent | 10 | 65 to 76, median 71 |
| adr | 11 | 116.4 to 189.1, median 156.2 |
| kills_per_round | 11 | 0.65 to 1.01, median 0.83 |
| assists_per_round | 11 | 0.08 to 0.23, median 0.14 |
| fk_fd_ratio | 11 | 0.9 to 4, median 1.11 |
| first_kill_percent | 11 | 16 to 27, median 20 |
| first_death_percent | 11 | 7 to 20, median 16 |
| headshot_percent | 10 | 22 to 36, median 26 |
| max_kills | 11 | 18 to 29, median 26 |
| kills | 11 | 91 to 263, median 117 |
| deaths | 11 | 72 to 254, median 104 |
| assists | 11 | 11 to 30, median 22 |
| first_kills | 11 | 4 to 61, median 25 |
| first_deaths | 11 | 1 to 68, median 23 |
| clutch_percent | 7 | 0 to 33, median 11 |
| clutches_won | 7 | 0 to 4, median 1 |
| clutches_total | 7 | 1 to 27, median 11 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| tier | string | No | Comma-separated tiers from vct, vcl, t3, gc, cg, off; site default vct | ||
| region | string | No | Comma-separated regions from americas, emea, pacific, china, intl | ||
| timespan | string | No | Timespan; one of all, 30d, 60d, 90d or a four-digit season year from 2020 up to the current year (2020, 2021, 2022, 2023, 2024, 2025, 2026 today; a new year is accepted when it starts); site default 60d | ||
| side | string | No | Side; one of all, t, ct Allowed values: all, t, ct. | ||
| role | string | No | Comma-separated roles from controller, initiator, sentinel, duelist | ||
| agent | string | No | Comma-separated agents from astra, brimstone, clove, harbor, miks, omen, viper, breach, fade, gekko, kayo, skye, sova, tejo, chamber, cypher, deadlock, killjoy, sage, veto, vyse, iso, jett, neon, phoenix, raze, reyna, waylay, yoru | ||
| map | string | No | Comma-separated maps from abyss, bind, corrode, haven, lotus, summit, sunset, ascent, breeze, fracture, icebox, pearl, split | ||
| min_rounds | integer | No | Minimum rounds played; site default 100 Minimum: 0. | ||
| from | string | No | First day of a custom date range, YYYY-MM-DD (UTC); requires to and replaces timespan | 2026-09-01 | |
| to | string | No | Last day of a custom date range, YYYY-MM-DD (UTC); requires from and replaces timespan | 2026-10-01 | |
| min_rating | integer | No | Minimum player rating; one of 0, 1300, 1400, 1500, 1550, 1650, 1750, 1850 Allowed values: 0, 1300, 1400, 1500, 1550, 1650, 1750, 1850. | ||
| sort | string | No | rating | Sort column; one of rating, maps, rnd, acs, kd, kast, adr, kpr, apr, fkfd, fkpr, fdpr, hsp, clp, cl, kmax, k, d, a, fk, fd; defaults to rating Allowed values: rating, maps, rnd, acs, kd, kast, adr, kpr, apr, fkfd, fkpr, fdpr, hsp, clp, cl, kmax, k, d, a, fk, fd. | |
| dir | string | No | desc | Sort direction; one of asc, desc; defaults to desc Allowed values: asc, desc. | |
| page | integer | No | 1 | 1-based page number; defaults to 1 Minimum: 1. Maximum: 500. |
curl -X GET "https://api.crawlora.net/api/v1/vlr/stats?side=all&min_rating=0&sort=rating&dir=asc&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://www.vlr.gg/stats",
"fetched_at": "2026-10-27T10:00:00Z",
"page": 1,
"count": 1,
"has_more": true,
"players": [
{
"player": {
"id": "29242",
"name": "erde",
"team": "LOUD",
"country_code": "cl"
},
"agents": [
"omen",
"sage"
],
"agent_usage": [
"54%",
"43%"
],
"maps": 35,
"rounds": 752,
"rating": 1.22,
"acs": 224,
"kd": 1.27,
"kast_percent": 76,
"adr": 147.2,
"first_kill_percent": 10,
"headshot_percent": 28,
"clutches_won": 13,
"clutches_total": 89,
"kills": 594,
"deaths": 466,
"assists": 289
}
]
}
}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.StatsResponse | No | ||||
| data.count | integer | No | 50 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.has_more | boolean | No | true | |||
| data.page | integer | No | 1 | |||
| data.players | array | No | ||||
| data.players[].acs | number | No | 224 | |||
| data.players[].adr | number | No | 147.2 | |||
| data.players[].agent_usage | array | No | 54% | |||
| data.players[].agents | array | No | Jett | |||
| data.players[].assists | integer | No | 289 | |||
| data.players[].assists_per_round | number | No | 0.38 | |||
| data.players[].clutch_percent | number | No | 15 | |||
| data.players[].clutches_total | integer | No | 89 | |||
| data.players[].clutches_won | integer | No | 13 | |||
| data.players[].deaths | integer | No | 466 | |||
| data.players[].first_death_percent | number | No | 9 | |||
| data.players[].first_deaths | integer | No | 69 | |||
| data.players[].first_kill_percent | number | No | 10 | |||
| data.players[].first_kills | integer | No | 73 | |||
| data.players[].fk_fd_ratio | number | No | 1.06 | |||
| data.players[].headshot_percent | number | No | 28 | |||
| data.players[].kast_percent | number | No | 76 | |||
| data.players[].kd | number | No | 1.27 | |||
| data.players[].kills | integer | No | 594 | |||
| data.players[].kills_per_round | number | No | 0.79 | |||
| data.players[].maps | integer | No | 35 | |||
| data.players[].max_kills | integer | No | 28 | |||
| data.players[].player | vlr.PlayerRef | No | ||||
| data.players[].player.country_code | string | No | cl | |||
| data.players[].player.id | string | No | 29242 | |||
| data.players[].player.name | string | No | erde | |||
| data.players[].player.team | string | No | LOUD | |||
| data.players[].rating | number | No | 1.22 | |||
| data.players[].rounds | integer | No | 752 | |||
| data.source_url | string | No | https://www.vlr.gg/matches | |||
| 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/vlr/stats?side=all&min_rating=0&sort=rating&dir=asc&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"