OpenDota API endpoint
Returns a Dota 2 hero's ability keys, its eight talents by level and its facets (title, description, color, deprecated flag). An unknown hero id, or a hero OpenDota has no ability data for, returns 404.
/opendota/hero-abilitiesHeader: x-api-key required.
Parameters:
hero_id: required positive hero id from opendota-heroes.Notable response behavior:
abilities and talent key values are internal ability keys; resolve them to names and descriptions with opendota-abilities q.10, 15, 20, 25 have two each); deprecated facets stay in the list with deprecated true. An unknown hero returns 404. The response is cached for up to one day.| Field | Filled in, of 8 checked | Values in the sample |
|---|---|---|
| level | 8 | 1 to 4, median 2 |
| key | 8 |
| 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-abilities?hero_id=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/hero-abilities",
"fetched_at": "2026-10-28T10:00:00Z",
"hero_id": 1,
"hero_name": "Anti-Mage",
"abilities": [
"antimage_mana_break",
"antimage_blink"
],
"talents": [
{
"level": 1,
"key": "special_bonus_hp_regen_3"
}
],
"facets": [
{
"id": 0,
"key": "antimage_magebanes_mirror",
"title": "Magebane's Mirror",
"color": "Purple",
"deprecated": true
}
]
}
}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.HeroAbilitiesResponse | No | ||||
| data.abilities | array | No | ||||
| data.facets | array | No | ||||
| data.facets[].color | string | No | Purple | |||
| data.facets[].deprecated | boolean | No | false | |||
| data.facets[].description | string | No | ||||
| data.facets[].id | integer | No | 0 | |||
| data.facets[].key | string | No | antimage_magebanes_mirror | |||
| data.facets[].title | string | No | Magebane's Mirror | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.hero_id | integer | No | 1 | |||
| data.hero_name | string | No | Anti-Mage | |||
| data.source_url | string | No | ||||
| data.talents | array | No | ||||
| data.talents[].key | string | No | special_bonus_hp_regen_3 | |||
| data.talents[].level | integer | No | 10 | |||
| 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-abilities?hero_id=1" \
-H "x-api-key: $CRAWLORA_API_KEY"