OpenDota API endpoint
Returns recent professional and public matches in which a hero was played (about 100), each with the side it played, whether it won, its kills, deaths and assists, duration and league when there is one. Players' account ids are not returned. An unknown hero id returns not found.
/opendota/hero-matchesHeader: x-api-key required.
Parameters:
hero_id: required positive hero id from opendota-heroes.Notable response behavior:
played_radiant), won, kills, deaths, assists, duration and, for league games, league_id and league_name. Players' account ids are never returned.404. The response is cached for up to five minutes.| Field | Filled in, of 100 checked | Values in the sample |
|---|---|---|
| match_id | 100 | |
| start_time | 100 | 2026-06-23 to 2026-10-28 |
| duration_seconds | 100 | 1,237 to 3,581, median 2,350 |
| played_radiant | 100 | true in 47 of 100 |
| won | 100 | true in 48 of 100 |
| league_id | 100 | |
| league_name | 100 | “PARI UNIVERSE by FISSURE” and 15 other values |
| kills | 100 | 0 to 23, median 7 |
| deaths | 100 | 0 to 11, median 3 |
| assists | 100 | 0 to 18, median 5 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| hero_id | integer | Yes | Positive hero ID from opendota-heroes | 1 |
curl -X GET "https://api.crawlora.net/api/v1/opendota/hero-matches?hero_id=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/heroes/1/matches",
"fetched_at": "2026-10-29T01:20:00Z",
"hero_id": 1,
"localized_name": "Anti-Mage",
"count": 1,
"matches": [
{
"match_id": 9066084051,
"start_time": "2026-10-28T16:08:19Z",
"duration_seconds": 2767,
"played_radiant": false,
"won": false,
"league_id": 20395,
"league_name": "PARI UNIVERSE by FISSURE",
"kills": 5,
"deaths": 9,
"assists": 5
}
]
}
}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.HeroMatchesResponse | No | ||||
| data.count | integer | No | 100 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.hero_id | integer | No | 1 | |||
| data.localized_name | string | No | Anti-Mage | |||
| data.matches | array | No | ||||
| data.matches[].assists | integer | No | 5 | |||
| data.matches[].deaths | integer | No | 9 | |||
| data.matches[].duration_seconds | integer | No | 2767 | |||
| data.matches[].kills | integer | No | 5 | |||
| data.matches[].league_id | integer | No | 20395 | |||
| data.matches[].league_name | string | No | PARI UNIVERSE by FISSURE | |||
| data.matches[].match_id | integer | No | 9066084051 | |||
| data.matches[].played_radiant | boolean | No | false | |||
| data.matches[].start_time | string | No | 2026-10-28T16:08:19Z | |||
| data.matches[].won | boolean | No | false | |||
| data.source_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/opendota/hero-matches?hero_id=1" \
-H "x-api-key: $CRAWLORA_API_KEY"