OpenDota API
Live read-only access to OpenDota match details, player profiles and win/loss statistics, player search, and hero performance data. Responses preserve OpenDota's source fields and identify the residential HTTP transport used.
Endpoint health
Loading verification…
Connect your agent
Connect through MCP so your agent can find this API, read its docs, and call its endpoints.
Add the server from your terminal.
claude mcp add --transport http agent-data https://agent-data.motie.dev/mcpIn Claude Code, run /mcp, select agent-data, then Authenticate. Sign in to your agent-data account in the browser.
Then ask your agent to use the OpenDota API for your task.
Call it over HTTP
Get an API keySign up free, generate an API key, and set it as AGENT_DATA_API_KEY in your environment. Your first 100 calls each month are free.
curl --request GET --get 'https://api.agent-data.dev/opendota-com/v1/matches/9011851189' \
--header "Authorization: Bearer $AGENT_DATA_API_KEY"Endpoints
Inputs and response fields for every endpoint in this API.
GETMatch by id/v1/matches/{match_id}
Return source match fields and per-player statistics for one match ID.
Input
match_idRequiredPath · integer, min: 1Numeric OpenDota match ID.
Example: 9011851189
Response
playersobject[]players[].kills?integer | nullplayers[].level?integer | nullplayers[].deaths?integer | nullplayers[].denies?integer | nullplayers[].assists?integer | nullplayers[].hero_id?integer | nullplayers[].last_hits?integer | nullplayers[].net_worth?integer | nullplayers[].account_id?integer | nullplayers[].xp_per_min?integer | nullplayers[].player_slot?integer | nullplayers[].gold_per_min?integer | nulldurationintegermatch_idintegergame_modeintegertransportstringdire_scoreintegerlobby_typeintegerstart_timeintegerradiant_winbooleanradiant_scoreintegerFields marked ? are optional.
GETPlayer search/v1/players/search
Return source-ranked search results for the supplied player name query.
Input
queryRequiredQuery · stringSearch text matched against player personaname.
Example: me./ nobody
Response
itemsobject[]items[].sml?number | nullitems[].account_idintegeritems[].avatarfull?string | nullitems[].personaname?string | nullitems[].last_match_time?string | integer | nulltransportstringFields marked ? are optional.
GETPlayer by id/v1/players/{account_id}
Return OpenDota profile, rank tier and leaderboard rank for one account.
Input
account_idRequiredPath · integer, min: 1Numeric Steam account ID.
Example: 312542697
Response
profileobjectprofile.account_idintegerprofile.avatarfull?string | nullprofile.profileurl?string | nullprofile.personaname?string | nullprofile.loccountrycode?string | nullrank_tierinteger | nulltransportstringleaderboard_rankinteger | nullFields marked ? are optional.
GETPlayer win loss/v1/players/{account_id}/wl
Return win and loss counts; supported optional filters are passed to OpenDota.
Input
account_idRequiredPath · integer, min: 1Numeric Steam account ID.
Example: 312542697
dateOptionalQuery · integer, min: 0 | nullLimit matches to the most recent number of days.
Example: 365
patchOptionalQuery · integer, min: 0 | nullFilter by OpenDota patch ID.
Example: 60
regionOptionalQuery · integer, min: 0 | nullFilter by OpenDota region ID.
Example: 8
hero_idOptionalQuery · integer, min: 0 | nullFilter by Dota hero ID.
Example: 28
game_modeOptionalQuery · integer, min: 0 | nullFilter by Dota game mode ID.
Example: 1
lobby_typeOptionalQuery · integer, min: 0 | nullFilter by Dota lobby type ID.
Example: 1
Response
winintegerloseintegertransportstringGETHero stats/v1/heroes/stats
Return all OpenDota hero rows, including rank-bracket, professional and turbo data.
Input
No input parameters.
Response
itemsobject[]items[].idintegeritems[].namestringitems[].1_win?integer | nullitems[].2_win?integer | nullitems[].3_win?integer | nullitems[].4_win?integer | nullitems[].5_win?integer | nullitems[].6_win?integer | nullitems[].7_win?integer | nullitems[].8_win?integer | nullitems[].roles?string[]items[].1_pick?integer | nullitems[].2_pick?integer | nullitems[].3_pick?integer | nullitems[].4_pick?integer | nullitems[].5_pick?integer | nullitems[].6_pick?integer | nullitems[].7_pick?integer | nullitems[].8_pick?integer | nullitems[].pro_ban?integer | nullitems[].pro_win?integer | nullitems[].pub_win?integer | nullitems[].pro_pick?integer | nullitems[].pub_pick?integer | nullitems[].turbo_wins?integer | nullitems[].attack_type?string | nullitems[].turbo_picks?integer | nullitems[].primary_attr?string | nullitems[].pub_win_trend?integer[]items[].localized_namestringitems[].pub_pick_trend?integer[]items[].turbo_wins_trend?integer[]items[].turbo_picks_trend?integer[]transportstringFields marked ? are optional.
Don’t see the endpoint you need?
Ask agent-data to add an endpoint or return more fields. Extensions are free and keep existing endpoints working.
An account is required to submit an extension. Prepare your request, then sign in to build.