OpenDota API endpoint
Returns one OpenDota lookup table as a sorted list of `id`/`name` entries, used to decode ids in match data: game modes and lobby types (with `balanced`), patches (with release `date`), regions, server clusters (`value` is the region id), item and ability ids, permanent buff ids, experience thresholds per level (`value`) countries (`id` is the ISO code), order types (`order_types`, the unit order names) player slot colors (`player_colors`, hex colors), chat wheel phrases (`chat_wheel`, `name` is the label and `text` the message), item rarity colors (`item_colors`, `text` is the hex color), neutral ancient creeps (`ancients`) and skillshot abilities (`skillshots`). `resource` is one of `game_mode`, `lobby_type`, `patch`, `region`, `cluster`, `item_ids`, `ability_ids`, `permanent_buffs`, `xp_level`, `countries`.
/opendota/constantsReturns an OpenDota lookup table for decoding ids found in Dota 2 match data.
Header: x-api-key required.
Parameters:
resource: required; allowed values: game_mode, lobby_type, patch, region, cluster, item_ids, ability_ids, permanent_buffs, xp_level, countries, order_types, player_colors, chat_wheel, item_colors, ancients, skillshots.Notable response behavior:
game_mode and lobby_type entries carry balanced; patch entries carry date; cluster and xp_level entries carry a numeric value (region id and cumulative experience).order_types maps numeric unit order ids to names such as DOTA_UNIT_ORDER_MOVE_TO_POSITION (41 entries); player_colors maps a player slot id to its hex color.chat_wheel maps each chat wheel phrase id to its name (the label) and text (the message, 677 phrases); item_colors maps an item rarity (common, rare, epic, ...) to its hex color in text (7 entries); ancients lists the neutral ancient creep names (14) and skillshots the skillshot ability names (4), both as id only.item_ids and ability_ids map numeric ids to internal names such as blink; ability_ids has about 3,000 entries.heroes, items, abilities, hero_abilities and patchnotes have their own routes, aghs_desc and hero_lore are served by opendota-hero-descriptions, and neutral_abilities (74 image-only entries) is not exposed. The response is cached for up to a day.| Field | Filled in, of 26 checked | Values in the sample |
|---|---|---|
| id | 26 | |
| name | 26 | “game_mode_unknown” and 25 other values |
| balanced | 26 | true in 10 of 26 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| resource | string | Yes | Lookup table; one of game_mode, lobby_type, patch, region, cluster, item_ids, ability_ids, permanent_buffs, xp_level, countries, order_types, player_colors, chat_wheel, item_colors, ancients, skillshots Allowed values: game_mode, lobby_type, patch, region, cluster, item_ids, ability_ids, permanent_buffs, xp_level, countries, order_types, player_colors, chat_wheel, item_colors, ancients, skillshots. | game_mode |
curl -X GET "https://api.crawlora.net/api/v1/opendota/constants?resource=game_mode" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/constants",
"fetched_at": "2026-10-28T10:00:00Z",
"resource": "game_mode",
"count": 2,
"entries": [
{
"id": "1",
"name": "game_mode_all_pick",
"balanced": true
},
{
"id": "2",
"name": "game_mode_captains_mode",
"balanced": 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.ConstantsResponse | No | ||||
| data.count | integer | No | 26 | |||
| data.entries | array | No | ||||
| data.entries[].balanced | boolean | No | true | |||
| data.entries[].date | string | No | 2024-08-14T00:00:00Z | |||
| data.entries[].id | string | No | 2 | |||
| data.entries[].name | string | No | game_mode_captains_mode | |||
| data.entries[].text | string | No | Careful! | |||
| data.entries[].value | integer | No | 240 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.resource | string | No | game_mode | |||
| 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 |
| 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/constants?resource=game_mode" \
-H "x-api-key: $CRAWLORA_API_KEY"