OpenDota API endpoint
Returns recent public Dota 2 matches in which the given heroes were on team A and/or team B, with both full lineups (radiant and dire), whether Radiant won, and which side the requested team A heroes were on and whether they won. Provide at least one hero id in total; each side takes up to 5 comma-separated hero ids from opendota-heroes. Unknown or repeated hero ids return an invalid-parameter error.
/opendota/find-matchesHeader: x-api-key required.
Parameters:
team_a: optional comma-separated hero ids (up to 5) that must be on team A, from opendota-heroes.team_b: optional comma-separated hero ids (up to 5) that must be on team B.Notable response behavior:
team_a and team_b. A non-number, an id that is not in opendota-heroes, a repeated id or more than five ids on one side returns 400 before any search.radiant and dire lineups (hidden slots are left out) and radiant_win. Your team_a heroes can be on either side, so each match also has team_a_side (radiant or dire) and team_a_win, worked out from where the team_a heroes were; both are omitted when team_a is empty.| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| match_id | 10 | |
| start_time | 10 | 2026-10-29 |
| radiant_win | 10 | true in 5 of 10 |
| radiant | 10 | median 5 entries |
| dire | 10 | median 5 entries |
| team_a_side | 10 | dire (6), radiant (4) |
| team_a_win | 10 | true in 5 of 10 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| team_a | string | No | Comma-separated hero ids (up to 5) that must be on team A | 1,2 | |
| team_b | string | No | Comma-separated hero ids (up to 5) that must be on team B | 3 |
curl -X GET "https://api.crawlora.net/api/v1/opendota/find-matches" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/findMatches?teamA=1&teamA=2&teamB=2",
"fetched_at": "2026-10-29T01:20:00Z",
"team_a_hero_ids": [
1,
2
],
"team_b_hero_ids": [
2
],
"count": 1,
"matches": [
{
"match_id": 9066484102,
"start_time": "2026-10-29T00:37:42Z",
"radiant_win": true,
"radiant": [
{
"hero_id": 3,
"localized_name": "Bane"
}
],
"dire": [
{
"hero_id": 1,
"localized_name": "Anti-Mage"
},
{
"hero_id": 2,
"localized_name": "Axe"
}
],
"team_a_side": "dire",
"team_a_win": false
}
]
}
}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.FindMatchesResponse | No | ||||
| data.count | integer | No | 20 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.matches | array | No | ||||
| data.matches[].dire | array | No | ||||
| data.matches[].dire[].hero_id | integer | No | 1 | |||
| data.matches[].dire[].localized_name | string | No | Anti-Mage | |||
| data.matches[].match_id | integer | No | 9066484102 | |||
| data.matches[].radiant | array | No | ||||
| data.matches[].radiant[].hero_id | integer | No | 1 | |||
| data.matches[].radiant[].localized_name | string | No | Anti-Mage | |||
| data.matches[].radiant_win | boolean | No | true | |||
| data.matches[].start_time | string | No | 2026-10-29T00:37:42Z | |||
| data.matches[].team_a_side | string | No | radiant, dire | dire | ||
| data.matches[].team_a_win | boolean | No | false | |||
| data.source_url | string | No | ||||
| data.team_a_hero_ids | array | No | ||||
| data.team_b_hero_ids | array | 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/find-matches" \
-H "x-api-key: $CRAWLORA_API_KEY"