OpenDota API endpoint
Returns a compact parsed match summary and player lines for one numeric OpenDota match ID. Copy the ID from opendota_live, opendota_pro_matches, opendota_league_matches, or opendota_league_match_ids. Replay-derived player data can be absent or delayed; a missing match ID returns not found. Steam account IDs, chat logs, replay salts and raw telemetry are not returned. `hero_id` is resolved with opendota_heroes.
/opendota/matchHeader: Crawlora x-api-key required; no OpenDota API key is needed upstream.
Parameters:
id: required positive OpenDota numeric match ID. Copy it from opendota-live, opendota-pro-matches, opendota-league-matches, or opendota-league-match-ids.Notable response behavior:
players is omitted. A match whose replay is unavailable may have only the match summary.hero_id values come from OpenDota's current hero index; use opendota-heroes to resolve them.| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| name | 10 | “Sage of the Six Paths” and 9 other values |
| is_radiant | 10 | true in 5 of 10 |
| hero_id | 10 | |
| kills | 10 | 0 to 12, median 4 |
| deaths | 10 | 0 to 11, median 2 |
| assists | 10 | 1 to 18, median 6 |
| last_hits | 10 | 26 to 388, median 301 |
| denies | 10 | 0 to 24, median 3 |
| gold_per_min | 10 | 240 to 728, median 497 |
| xp_per_min | 10 | 314 to 873, median 551 |
| net_worth | 10 | 5,797 to 24,575, median 15,438 |
| hero_damage | 10 | 7,643 to 26,481, median 12,042 |
| tower_damage | 10 | 0 to 11,135, median 314 |
| level | 10 | 13 to 23, median 18 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | integer | Yes | Positive OpenDota match ID from live, pro-match, league-match, or league-match-ID results | 9063495955 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/opendota/match?id=9063495955" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/matches/9063495955",
"fetched_at": "2026-10-27T09:50:00Z",
"match_id": 9063495955,
"start_time": "2026-10-26T20:56:07Z",
"duration_seconds": 2052,
"league_id": 20395,
"league_name": "PARI UNIVERSE by FISSURE",
"patch": 59,
"radiant_win": true,
"radiant_score": 32,
"dire_score": 9,
"radiant": {
"id": 8255888,
"name": "BETBOOM TEAM",
"tag": "BB"
},
"dire": {
"id": 10291652,
"name": "LEGION",
"tag": "LEGION"
},
"players": [
{
"name": "player-name",
"is_radiant": true,
"hero_id": 93,
"kills": 5,
"deaths": 1,
"assists": 16,
"last_hits": 287,
"denies": 12,
"gold_per_min": 656,
"xp_per_min": 781,
"net_worth": 21553,
"hero_damage": 24331,
"tower_damage": 1234,
"level": 28
}
]
}
}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 | opendota.MatchDetail | No | ||||
| data.dire | opendota.MatchTeam | No | ||||
| data.dire.id | integer | No | 8255888 | |||
| data.dire.logo_url | string | No | https://cdn.opendota.com/team-logo.png | |||
| data.dire.name | string | No | BETBOOM TEAM | |||
| data.dire.tag | string | No | BB | |||
| data.dire_score | integer | No | 9 | |||
| data.duration_seconds | integer | No | 2052 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.league_id | integer | No | 20395 | |||
| data.league_name | string | No | PARI UNIVERSE by FISSURE | |||
| data.match_id | integer | No | 9063495955 | |||
| data.patch | integer | No | 59 | |||
| data.players | array | No | ||||
| data.players[].assists | integer | No | 16 | |||
| data.players[].deaths | integer | No | 1 | |||
| data.players[].denies | integer | No | 12 | |||
| data.players[].gold_per_min | integer | No | 656 | |||
| data.players[].hero_damage | integer | No | 24331 | |||
| data.players[].hero_id | integer | No | 93 | |||
| data.players[].is_radiant | boolean | No | true | |||
| data.players[].kills | integer | No | 5 | |||
| data.players[].last_hits | integer | No | 287 | |||
| data.players[].level | integer | No | 28 | |||
| data.players[].name | string | No | player-name | |||
| data.players[].net_worth | integer | No | 21553 | |||
| data.players[].tower_damage | integer | No | 1234 | |||
| data.players[].xp_per_min | integer | No | 781 | |||
| data.radiant | opendota.MatchTeam | No | ||||
| data.radiant.id | integer | No | 8255888 | |||
| data.radiant.logo_url | string | No | https://cdn.opendota.com/team-logo.png | |||
| data.radiant.name | string | No | BETBOOM TEAM | |||
| data.radiant.tag | string | No | BB | |||
| data.radiant_score | integer | No | 32 | |||
| data.radiant_win | boolean | No | true | |||
| data.source_url | string | No | ||||
| data.start_time | string | No | 2026-10-26T20:56:07Z | |||
| 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/opendota/match?id=9063495955" \
-H "x-api-key: $CRAWLORA_API_KEY"