OpenDota API endpoint
Returns the complete match list supplied for one OpenDota league, including match ID, teams, scores, start time and series metadata. Optionally filter locally to matches involving one team; league_id and team_id are echoed. This source route is not paginated and can include completed or scheduled rows; use opendota_match for parsed player statistics.
/opendota/league-matchesReturns match summaries supplied by OpenDota for one league, with optional local filtering to one team.
Header: Crawlora x-api-key required; no OpenDota API key is needed upstream.
Query parameters:
league_id: required positive OpenDota league ID from opendota-leagues.team_id: optional positive team ID from opendota-teams. Keeps rows where the team is Radiant or Dire.Notable response behavior:
20395 returned 45 rows. Use opendota-league-match-ids for match IDs from leagues that have no detailed match list.start_time is UTC in RFC 3339 format. duration_seconds and scores are source values; a zero duration can represent a match that has not finished.team_id filter is applied locally; the source_url identifies the unfiltered upstream request.league_id and the optional team_id filter are echoed in the response.matches array.2031 returned []. Use opendota-league-match-ids for the source's ID-only path, which includes amateur leagues.The sample array is abbreviated; count reports all matching league rows.
| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| match_id | 10 | |
| start_time | 10 | 2026-10-23 to 2026-10-27 |
| duration_seconds | 10 | 1,462 to 3,537, median 2,196 |
| league_id | 10 | |
| radiant_team_id | 10 | |
| dire_team_id | 10 | |
| radiant_score | 10 | 13 to 41, median 24 |
| dire_score | 10 | 9 to 49, median 21 |
| radiant_win | 10 | true in 7 of 10 |
| series_id | 10 | |
| series_type | 10 | 1 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| league_id | integer | Yes | Positive league ID from opendota_leagues | 20395 | |
| team_id | integer | No | Optional positive team ID; keeps matches where this team is Radiant or Dire | 8255888 |
curl -X GET "https://api.crawlora.net/api/v1/opendota/league-matches?league_id=20395" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.opendota.com/api/leagues/20395/matches",
"fetched_at": "2026-10-27T12:00:00Z",
"league_id": 20395,
"team_id": 8255888,
"count": 45,
"matches": [
{
"match_id": 9063495955,
"start_time": "2026-10-26T20:56:07Z",
"duration_seconds": 2052,
"league_id": 20395,
"radiant_team_id": 8255888,
"radiant_name": "BETBOOM TEAM",
"dire_team_id": 10291652,
"dire_name": "LEGION",
"radiant_score": 32,
"dire_score": 9,
"radiant_win": true,
"series_id": 1160235,
"series_type": 3
}
]
}
}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.LeagueMatchesResponse | No | ||||
| data.count | integer | No | 45 | |||
| data.fetched_at | string | No | 2026-10-27T10:00:00Z | |||
| data.league_id | integer | No | 20395 | |||
| data.matches | array | No | ||||
| data.matches[].dire_name | string | No | LEGION | |||
| data.matches[].dire_score | integer | No | 9 | |||
| data.matches[].dire_team_id | integer | No | 10291652 | |||
| data.matches[].duration_seconds | integer | No | 2052 | |||
| data.matches[].league_id | integer | No | 20395 | |||
| data.matches[].match_id | integer | No | 9063495955 | |||
| data.matches[].radiant_name | string | No | BETBOOM TEAM | |||
| data.matches[].radiant_score | integer | No | 32 | |||
| data.matches[].radiant_team_id | integer | No | 8255888 | |||
| data.matches[].radiant_win | boolean | No | true | |||
| data.matches[].series_id | integer | No | 1160235 | |||
| data.matches[].series_type | integer | No | 3 | |||
| data.matches[].start_time | string | No | 2026-10-26T20:56:07Z | |||
| data.source_url | string | No | ||||
| data.team_id | integer | No | 8255888 | |||
| 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/league-matches?league_id=20395" \
-H "x-api-key: $CRAWLORA_API_KEY"