Endpoint Playground
Returns OpenDota's scenario datasets as games, wins and win rate rows, most games first. `kind` selects `item-timings` (an item bought by a time for a hero), `lane-roles` (a hero in a lane role at a time) or `misc` (courier kill, first blood and chat scenarios by side and region). Filters are validated before any upstream call: `hero_id` and `item` apply to item-timings, `hero_id` and `lane_role` to lane-roles, `scenario` to misc.
29 Oct 2026: 2 rows; 7 fields had a value in every checked item.
Sample value profiles: time_seconds: 1,500 to 1,800, median 1,500; hero_name: “Anti-Mage”; item: “blink”.
curl 'https://api.crawlora.net/api/v1/opendota/scenarios?kind=item-timings&scenario=courier_kill' \
-H "x-api-key: $CRAWLORA_API_KEY"| Parameter | Type | Required | Prefilled value | Description |
|---|---|---|---|---|
| kind | string | Yes | item-timings | Dataset; one of item-timings, lane-roles, misc |
| hero_id | integer | No | Positive hero ID from opendota-heroes; item-timings and lane-roles only | |
| item | string | No | Item name from opendota-constants item_ids, for example bfury; item-timings only | |
| lane_role | integer | No | Lane role 1 to 4 (1 safe lane, 2 mid, 3 off lane, 4 jungle); lane-roles only | |
| scenario | string | No | courier_kill | Scenario; one of courier_kill, first_blood, neg_chat_1min, pos_chat_1min; misc only |
| limit | integer | No | Number of rows to return, 1 to 2000, most games first; defaults to all |
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/scenarios",
"fetched_at": "2026-10-28T10:00:00Z",
"kind": "item-timings",
"total": 7,
"count": 1,
"timings": [
450,
600,
720,
900,
1200,
1500,
1800
],
"rows": [
{
"hero_id": 1,
"hero_name": "Anti-Mage",
"item": "bfury",
"time_seconds": 900,
"games": 10,
"wins": 7,
"win_rate_percent": 70
}
]
}
}The sample response, schema and code snippets below work without an account. Sending a live request needs an API key.