OpenDota API endpoint
Returns the heroes a team has played with games, wins and win rate, sorted by games played. Heroes the team never played are omitted. An unknown team id returns not found.
/opendota/team-heroesReturns a team's hero pool with games, wins and win rate.
Header: x-api-key required.
Parameters:
team_id: required positive OpenDota team id from opendota-teams or a match response.Notable response behavior:
win_rate_percent is a percentage.404; an existing team without games returns an empty list. The response is cached for up to one hour.| Field | Filled in, of 127 checked | Values in the sample |
|---|---|---|
| hero_id | 127 | |
| localized_name | 127 | “Beastmaster” and 126 other values |
| games | 127 | 1 to 144, median 45 |
| wins | 127 | 0 to 95, median 27 |
| win_rate_percent | 127 | 0 to 100, median 55.1 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| team_id | integer | Yes | Positive OpenDota team ID from opendota-teams or a match response | 8255888 |
curl -X GET "https://api.crawlora.net/api/v1/opendota/team-heroes?team_id=8255888" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/team-heroes",
"fetched_at": "2026-10-28T10:00:00Z",
"team_id": 8255888,
"count": 1,
"heroes": [
{
"hero_id": 38,
"localized_name": "Beastmaster",
"games": 144,
"wins": 95,
"win_rate_percent": 65.97
}
]
}
}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.TeamHeroesResponse | No | ||||
| data.count | integer | No | 127 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.heroes | array | No | ||||
| data.heroes[].games | integer | No | 82 | |||
| data.heroes[].hero_id | integer | No | 17 | |||
| data.heroes[].localized_name | string | No | Storm Spirit | |||
| data.heroes[].win_rate_percent | number | No | 50 | |||
| data.heroes[].wins | integer | No | 41 | |||
| data.source_url | string | No | ||||
| data.team_id | integer | No | 8255888 | |||
| 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/team-heroes?team_id=8255888" \
-H "x-api-key: $CRAWLORA_API_KEY"