Endpoint Playground
Returns about 100 recent ranked public Dota 2 matches with the heroes on each side, game mode, lobby type and average rank tier, optionally limited to a rank range. Rank tiers are the medal (1 Herald, 2 Guardian, 3 Crusader, 4 Archon, 5 Legend, 6 Ancient, 7 Divine, 8 Immortal) times ten plus stars 1 to 5. Page back with `less_than_match_id` set to the previous `next_less_than_match_id`. Players' account ids are not returned.
29 Oct 2026: 100 matches; 12 fields had a value in every checked item.
Sample value profiles: start_time: 2026-10-29; duration_seconds: 258 to 1,920, median 1,320; radiant_win: true in 58 of 100.
curl 'https://api.crawlora.net/api/v1/opendota/public-matches?min_rank=11&max_rank=11' \
-H "x-api-key: $CRAWLORA_API_KEY"| Parameter | Type | Required | Prefilled value | Description |
|---|---|---|---|---|
| min_rank | integer | No | 11 | Lowest average rank tier, medal 1-8 times ten plus stars 1-5 |
| max_rank | integer | No | 11 | Highest average rank tier, same form as min_rank; not below min_rank |
| less_than_match_id | integer | No | Return matches older than this match id |
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/publicMatches?max_rank=85&min_rank=71",
"fetched_at": "2026-10-29T01:20:00Z",
"min_rank": 71,
"max_rank": 85,
"count": 1,
"next_less_than_match_id": 9066504584,
"matches": [
{
"match_id": 9066504584,
"start_time": "2026-10-29T01:16:41Z",
"duration_seconds": 1329,
"radiant_win": true,
"lobby_type": 0,
"game_mode": 22,
"avg_rank_tier": 71,
"avg_rank_medal": "Divine",
"ranked_players": 6,
"cluster": 171,
"radiant_heroes": [
{
"hero_id": 1,
"localized_name": "Anti-Mage"
}
],
"dire_heroes": [
{
"hero_id": 2,
"localized_name": "Axe"
}
]
}
]
}
}The sample response, schema and code snippets below work without an account. Sending a live request needs an API key.