HOK API: Honor-of-Kings-Daten für deine Programme

Lies Helden, Items, Arkana, Zauber, die Tier-Liste und Turnier-Drafts von Honor of Kings Global sowie deine eigenen Scrims aus einem Programm oder einem KI-Assistenten. Nur lesend, kostenlos, mit einem Schlüssel.

Schlüssel holen

Authentifizierung

Jede Adresse braucht einen API-Schlüssel, gesendet als Bearer-Token. Ein Schlüssel liest nur und sieht, was sein Besitzer sieht: die Spieldaten für alle, deine Scrims, Tier-Listen und Teams für dich.

Dein erster Aufruf
curl -H "Authorization: Bearer hok_YOUR_KEY" http://127.0.0.1:3000/api/v1/heroes

Der Header X-API-Key geht auch. Ein Schlüssel in der Adresse wird ignoriert: Adressen landen in Logs.

Limits und Fehler

Jeder Schlüssel darf 120 Anfragen pro Minute stellen. Fehler sind JSON mit einem festen Code:

StatuscodeBedeutung
400invalid_bodyDie an den einzigen POST gesendete Situation ist ungültig: Der Fehler sagt, was falsch ist.
401unauthorizedKein Schlüssel, oder ein ungültiger, abgelaufener oder widerrufener Schlüssel.
403insufficient_scopeDem Schlüssel fehlt der Bereich, den diese Adresse braucht.
404not_foundUnbekannte Adresse, oder etwas, das der Besitzer des Schlüssels nicht sehen darf.
405method_not_allowedDie API ist nur lesend: verwende GET.
429rate_limitedZu viele Anfragen: warte die Sekunden aus Retry-After ab.

Mit einer KI nutzen

Die API ist auch ein MCP-Server unter http://127.0.0.1:3000/api/v1/mcp: Ein Assistent bekommt ein Werkzeug pro Adresse, die sein Schlüssel lesen darf.

Erstelle einen Schlüssel pro Assistent, nur mit dem, was er braucht (die öffentlichen Spieldaten reichen für Fragen zu Helden, Items und Drafts). Wird einer bekannt, widerrufe ihn, ohne die anderen anzurühren.

Claude Code

Führe das in einem Terminal aus:

Terminal
claude mcp add --transport http hok-api http://127.0.0.1:3000/api/v1/mcp --header "Authorization: Bearer hok_YOUR_KEY"

Claude Desktop

Füge das in claude_desktop_config.json ein (Settings, Developer, Edit config) und starte Claude neu. Node.js wird benötigt.

claude_desktop_config.json
{
  "mcpServers": {
    "hok-api": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "http://127.0.0.1:3000/api/v1/mcp",
        "--header",
        "Authorization:${HOK_API_KEY}"
      ],
      "env": {
        "HOK_API_KEY": "Bearer hok_YOUR_KEY"
      }
    }
  }
}

Cursor

Füge das in .cursor/mcp.json ein, im Projekt oder in deinem Benutzerordner:

.cursor/mcp.json
{
  "mcpServers": {
    "hok-api": {
      "url": "http://127.0.0.1:3000/api/v1/mcp",
      "headers": {
        "Authorization": "Bearer hok_YOUR_KEY"
      }
    }
  }
}

ChatGPT

In einem eigenen GPT: Configure, Create new action, Import from URL mit dieser Adresse. Dann Authentication: API key, Typ Bearer, und deinen Schlüssel einfügen.

OpenAPI
http://127.0.0.1:3000/api/v1/openapi.json

Ersetze hok_YOUR_KEY durch deinen Schlüssel. Der Assistent sieht dann ein Werkzeug pro Adresse, die dein Schlüssel lesen darf, und liest nur.

Adressen

Die vollständige Beschreibung zum Import in ein Werkzeug: /api/v1/openapi.json (OpenAPI 3.1)

Spieldaten game

GET/api/v1/heroesSpieldaten

The heroes of the Global roster (name, classes, lanes, picture).

Werkzeug für eine KI: list_heroes

Beispielantwort
{
  "heroes": [
    {
      "id": "h105",
      "name": "Arli",
      "displayName": "Arli",
      "image": "https://camp.honorofkings.com/h105.png",
      "roles": [
        "Marksman"
      ],
      "lanes": [
        "Farm Lane"
      ],
      "laneSources": {
        "Farm Lane": "camp"
      },
      "sourceIds": [
        "105"
      ],
      "availableGlobal": true,
      "isFlowborn": false,
      "sourceUpdated": "20260925"
    }
  ],
  "lastUpdated": "2026-10-31T08:00:00.000Z",
  "sourceUpdated": "20260925",
  "usingCache": true,
  "language": "en",
  "namesLanguage": "en"
}
GET/api/v1/heroes/{id}Spieldaten

One hero: its sheet (skills, art), its recommended builds, its combos, its official ratings and the competitive figures.

Werkzeug für eine KI: get_hero

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
sinceAbfrageCount the tournament games from this day on, YYYY-MM-DD.
Beispielantwort
{
  "hero": {
    "id": "h105",
    "name": "Arli",
    "roles": [
      "Marksman"
    ],
    "lanes": [
      "Farm Lane"
    ]
  },
  "competitive": [],
  "tournament": {
    "since": null,
    "totalGames": 48,
    "picks": 21,
    "bans": 9,
    "wins": 12,
    "losses": 9,
    "winRate": 0.571,
    "pickRate": 0.438,
    "banRate": 0.188,
    "byRule": {},
    "range": {
      "first": "2026-08-01",
      "last": "2026-10-30"
    }
  },
  "builds": [],
  "profile": null,
  "ratings": {
    "Farm Lane": "A"
  },
  "ratingSources": {
    "Farm Lane": "tournaments"
  },
  "combos": [],
  "details": null,
  "detailsFetchedAt": null,
  "detailsLanguage": "en",
  "language": "en"
}
GET/api/v1/tier-listSpieldaten

The public tier list of each lane: tournament results first, the editors' ratings for the heroes played too little.

Werkzeug für eine KI: get_tier_list

Beispielantwort
{
  "period": {
    "from": "2026-08-01",
    "to": "2026-10-31"
  },
  "minGames": 10,
  "totalGames": 120,
  "lanes": [
    {
      "lane": "Farm Lane",
      "slug": "farm",
      "tiers": [
        {
          "label": "SS",
          "heroes": [
            {
              "heroId": "h105",
              "source": "tournaments",
              "games": 48,
              "winRate": 0.571,
              "pickRate": 0.438,
              "score": 0.62
            }
          ]
        }
      ],
      "unranked": [
        "h199"
      ]
    }
  ],
  "updatedAt": "2026-10-31T08:00:00.000Z"
}
GET/api/v1/catalogSpieldaten

The items, the arcana, the battle spells, the stats and the tags of the game, in one answer.

Werkzeug für eine KI: get_catalog

Beispielantwort
{
  "stats": [
    {
      "id": 1,
      "name": "Physical Attack"
    }
  ],
  "tags": [
    {
      "id": 3,
      "name": "Burst"
    }
  ],
  "tagGroups": {
    "red": "Damage"
  },
  "items": [],
  "arcana": [],
  "spells": [
    {
      "id": 1,
      "name": "Flash",
      "imageId": null,
      "description": "Blink a short distance.",
      "cooldownSeconds": 120,
      "unlockLevel": null
    }
  ],
  "heroTags": {}
}
GET/api/v1/catalog/{family}Spieldaten

One family of the catalogue: items, arcana, spells, stats or tags.

Werkzeug für eine KI: list_catalog_family

ParameterWoBeschreibung
family PflichtAdresseitems, arcana, spells, stats or tags.
Beispielantwort
{
  "spells": [
    {
      "id": 1,
      "name": "Flash",
      "imageId": null,
      "description": "Blink a short distance.",
      "cooldownSeconds": 120,
      "unlockLevel": null
    }
  ]
}
GET/api/v1/catalog/{family}/{id}Spieldaten

One item, arcana, spell, stat or tag, by its number: everything its page shows (stats and tags by their number).

Werkzeug für eine KI: get_catalog_entry

ParameterWoBeschreibung
family PflichtAdresseitems, arcana, spells, stats or tags.
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "id": 1,
  "name": "Flash",
  "imageId": null,
  "description": "Blink a short distance.",
  "cooldownSeconds": 120,
  "unlockLevel": null
}

Competitive-Szene competitive

GET/api/v1/tournamentsCompetitive-Szene

The tournament series entered by the staff.

Werkzeug für eine KI: list_tournaments

ParameterWoBeschreibung
qAbfrageWords to look for.
pageAbfrageThe page of the list, from 1.
Beispielantwort
{
  "items": [
    {
      "id": "8d1f6a52-3c1e-4b7e-9a51-1f2c3d4e5f60",
      "name": "KPL West Finals",
      "teamA": "Alpha",
      "teamB": "Bravo",
      "bestOf": 5,
      "status": "complete"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 25
}
GET/api/v1/tournaments/{id}Competitive-Szene

One tournament series with all its games: bans, picks, lanes, winner, duration.

Werkzeug für eine KI: get_tournament

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "id": "8d1f6a52-3c1e-4b7e-9a51-1f2c3d4e5f60",
  "teamA": {
    "name": "Alpha"
  },
  "teamB": {
    "name": "Bravo"
  },
  "bestOf": 5,
  "gameMode": "global-ban-pick",
  "status": "complete",
  "games": [
    {
      "number": 1,
      "bans": {
        "blue": [
          "h105"
        ],
        "red": [
          "h199"
        ]
      },
      "picks": {
        "blue": [
          "h101"
        ],
        "red": [
          "h120"
        ]
      },
      "winner": "blue",
      "durationSeconds": 1104
    }
  ]
}

Deine Scrims scrims

GET/api/v1/seriesDeine Scrims

Your series, and the ones a team of yours shared.

Werkzeug für eine KI: list_series

ParameterWoBeschreibung
pageAbfrageThe page of the list, from 1.
pageSizeAbfrageHow many entries a page holds.
viewAbfragesummary (lighter) or full.
sortAbfrageupdated, oldest or created.
statusAbfrageactive, complete or draw.
modeAbfrageThe game mode: global-ban-pick, free-for-all or classic.
draftModeAbfrageThe draft mode of the series.
qAbfrageWords to look for.
fromAbfrageThe first day, YYYY-MM-DD.
toAbfrageThe last day, YYYY-MM-DD.
Beispielantwort
{
  "items": [
    {
      "id": "16f3cb87-fb93-4a70-91e0-01f01f863f11",
      "teamA": "Alpha",
      "teamB": "Bravo",
      "bestOf": 3,
      "winsRequired": 2,
      "gameMode": "free-for-all",
      "draftMode": "solo",
      "status": "active",
      "score": {
        "teamA": 1,
        "teamB": 0
      },
      "gamesCount": 1,
      "role": "owner",
      "createdAt": "2026-10-31T20:15:23.262Z",
      "updatedAt": "2026-10-31T20:45:00.000Z"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 20
}
GET/api/v1/series/{id}Deine Scrims

One series with every game of it.

Werkzeug für eine KI: get_series

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "id": "16f3cb87-fb93-4a70-91e0-01f01f863f11",
  "createdAt": "2026-10-31T20:15:23.262Z",
  "updatedAt": "2026-10-31T20:45:00.000Z",
  "teamA": {
    "name": "Alpha"
  },
  "teamB": {
    "name": "Bravo"
  },
  "bestOf": 3,
  "winsRequired": 2,
  "gameMode": "free-for-all",
  "draftMode": "solo",
  "status": "active",
  "games": [],
  "currentGame": null,
  "version": 4,
  "serverTime": 1793477723366,
  "viewer": {
    "role": "owner",
    "side": null,
    "canDrive": true
  }
}
GET/api/v1/stats/overviewDeine Scrims

The statistics of your scrims (figures under the minimum sample are withheld).

Werkzeug für eine KI: scrim_stats_overview

ParameterWoBeschreibung
statusAbfrageactive, complete or draw.
modeAbfrageThe game mode: global-ban-pick, free-for-all or classic.
draftModeAbfrageThe draft mode of the series.
qAbfrageWords to look for.
fromAbfrageThe first day, YYYY-MM-DD.
toAbfrageThe last day, YYYY-MM-DD.
minGamesAbfrageThe fewest games a figure needs to be shown.
Beispielantwort
{
  "label": "Your scrims",
  "minGames": 30,
  "seriesCount": 14,
  "gamesCount": 37,
  "totalDurationSeconds": 42180,
  "averageDurationSeconds": 1140,
  "shortestSeconds": 702,
  "longestSeconds": 1598,
  "blueWins": 20,
  "redWins": 17,
  "blueWinRate": 0.541,
  "byMode": {
    "global-ban-pick": 30,
    "free-for-all": 7,
    "classic": 0
  }
}
GET/api/v1/stats/heroesDeine Scrims

The per-hero statistics of your scrims.

Werkzeug für eine KI: scrim_stats_heroes

ParameterWoBeschreibung
statusAbfrageactive, complete or draw.
modeAbfrageThe game mode: global-ban-pick, free-for-all or classic.
draftModeAbfrageThe draft mode of the series.
qAbfrageWords to look for.
fromAbfrageThe first day, YYYY-MM-DD.
toAbfrageThe last day, YYYY-MM-DD.
minGamesAbfrageThe fewest games a figure needs to be shown.
pageAbfrageThe page of the list, from 1.
pageSizeAbfrageHow many entries a page holds.
orderAbfrageHow the heroes are sorted (presence by default).
heroAbfrageOnly the heroes whose name holds these letters.
Beispielantwort
{
  "label": "Your scrims",
  "minGames": 30,
  "totalGames": 37,
  "sort": "presence",
  "rows": [
    {
      "heroId": "h105",
      "picks": 12,
      "bans": 9,
      "wins": 7,
      "presence": 0.568
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 10
}
GET/api/v1/heroes/{id}/scrimsDeine Scrims

What your scrims say of one hero: picks, bans, synergies, matchups.

Werkzeug für eine KI: hero_scrim_stats

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "label": "Your scrims",
  "minGames": 30,
  "seriesCount": 9,
  "totalGames": 37,
  "picked": 12,
  "wins": 7,
  "losses": 5,
  "banned": 9,
  "winRate": null,
  "pickRate": null,
  "banRate": null,
  "insufficient": true,
  "lanes": [],
  "synergies": [],
  "matchups": []
}

Deine Tier-Listen tier-lists

GET/api/v1/tier-listsDeine Tier-Listen

Your tier lists, and the ones shared with you.

Werkzeug für eine KI: list_my_tier_lists

ParameterWoBeschreibung
pageAbfrageThe page of the list, from 1.
pageSizeAbfrageHow many entries a page holds.
laneAbfrageOnly the lists of one lane.
qAbfrageWords to look for.
Beispielantwort
{
  "items": [
    {
      "id": "44d20ad7-4f74-4207-80f2-6e0b352ba662",
      "name": "Farm lane, season 4",
      "lane": "Farm Lane",
      "updatedAt": "2026-10-31T20:15:23.224Z"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 50
}
GET/api/v1/tier-lists/{id}Deine Tier-Listen

One tier list with its placements.

Werkzeug für eine KI: get_my_tier_list

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "id": "44d20ad7-4f74-4207-80f2-6e0b352ba662",
  "createdAt": "2026-10-31T20:15:23.224Z",
  "updatedAt": "2026-10-31T20:15:23.224Z",
  "name": "Farm lane, season 4",
  "lane": "Farm Lane",
  "tiers": [
    {
      "id": "t1",
      "label": "S",
      "heroes": [
        "h105"
      ]
    }
  ],
  "unranked": [
    "h199"
  ],
  "version": 0,
  "viewer": {
    "role": "owner",
    "canEdit": true,
    "canDelete": true,
    "canShare": true
  }
}

Deine Teams teams

GET/api/v1/me/teamsDeine Teams

The teams you belong to, with your role in each.

Werkzeug für eine KI: my_teams

Beispielantwort
{
  "items": [
    {
      "id": "07db7f13-4df0-4d4e-b6c9-453d26c41fe5",
      "name": "Learn Squad",
      "tag": "LERN",
      "region": "EU",
      "level": "amateur",
      "memberCount": 5,
      "myRole": "owner"
    }
  ]
}
GET/api/v1/teamsDeine Teams

The teams of the community.

Werkzeug für eine KI: list_teams

ParameterWoBeschreibung
qAbfrageWords to look for.
pageAbfrageThe page of the list, from 1.
pageSizeAbfrageHow many entries a page holds.
levelAbfrageOnly the teams of one level.
regionAbfrageOnly the teams of one region.
Beispielantwort
{
  "items": [
    {
      "id": "07db7f13-4df0-4d4e-b6c9-453d26c41fe5",
      "name": "Learn Squad",
      "tag": "LERN",
      "region": "EU",
      "level": "amateur",
      "memberCount": 5
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 18
}
GET/api/v1/teams/{id}Deine Teams

One team: its members and its settings that you may see.

Werkzeug für eine KI: get_team

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "id": "07db7f13-4df0-4d4e-b6c9-453d26c41fe5",
  "name": "Learn Squad",
  "tag": "LERN",
  "description": "",
  "region": "EU",
  "timezone": "UTC+1",
  "languages": [
    "en"
  ],
  "level": "amateur",
  "maxMembers": 10,
  "createdAt": 1793477723239,
  "members": [
    {
      "name": "Kai",
      "tag": "YHX7EA",
      "role": "owner",
      "lane": "Jungle"
    }
  ],
  "myRole": "owner"
}
GET/api/v1/teams/{id}/eventsDeine Teams

The agenda of one of your teams.

Werkzeug für eine KI: team_events

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "items": [
    {
      "id": "2b9c0e3a-6f0d-4a8e-b1c2-3d4e5f6a7b8c",
      "title": "Scrim vs Bravo",
      "startsAt": 1793563200000
    }
  ],
  "canSchedule": true
}
GET/api/v1/teams/{id}/seriesDeine Teams

The series that this team shared with its members.

Werkzeug für eine KI: team_series

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "items": [],
  "total": 0,
  "page": 1,
  "pageSize": 20
}
GET/api/v1/me/agendaDeine Teams

Your agenda: the events of all your teams.

Werkzeug für eine KI: my_agenda

ParameterWoBeschreibung
fromAbfrageThe start of the window, in milliseconds since 1970.
toAbfrageThe end of the window, in milliseconds since 1970.
Beispielantwort
{
  "items": [
    {
      "id": "2b9c0e3a-6f0d-4a8e-b1c2-3d4e5f6a7b8c",
      "title": "Scrim vs Bravo",
      "startsAt": 1793563200000
    }
  ]
}

Dein Training training

GET/api/v1/training/focusDein Training

The heroes you work on.

Werkzeug für eine KI: training_focus

Beispielantwort
{
  "heroIds": [
    "h105",
    "h120"
  ]
}
GET/api/v1/training/notesDein Training

Your training notebook.

Werkzeug für eine KI: training_notes

Beispielantwort
{
  "notes": []
}
GET/api/v1/training/combosDein Training

The combos you have acquired.

Werkzeug für eine KI: training_combos

Beispielantwort
{
  "progress": {}
}
GET/api/v1/training/combos/reviewDein Training

The combos that are due for a check.

Werkzeug für eine KI: training_combos_due

Beispielantwort
{
  "now": 1793477503716,
  "due": [],
  "dueTotal": 0,
  "toLearn": [],
  "toLearnTotal": 0,
  "skills": {}
}
GET/api/v1/training/mapsDein Training

The maps of the situations.

Werkzeug für eine KI: training_maps

Beispielantwort
{
  "maps": []
}
GET/api/v1/training/scenariosDein Training

The situations prepared by the staff.

Werkzeug für eine KI: list_training_scenarios

Beispielantwort
{
  "scenarios": []
}
GET/api/v1/training/scenarios/{id}Dein Training

One situation.

Werkzeug für eine KI: get_training_scenario

ParameterWoBeschreibung
id PflichtAdresseThe id of the thing.
Beispielantwort
{
  "id": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
  "title": "Defend the second tower",
  "mapId": "main"
}
GET/api/v1/training/reflexDein Training

Your reflex training results.

Werkzeug für eine KI: training_reflex

Beispielantwort
{
  "exercises": {
    "reaction": {
      "runs": 12,
      "best": 231,
      "last": []
    }
  },
  "doneToday": [],
  "today": {
    "runs": 3,
    "minutes": 4
  },
  "week": {
    "runs": 12,
    "minutes": 18
  },
  "streak": 2,
  "teams": []
}
GET/api/v1/spaceDein Training

Your personal space (the builds and notes you keep).

Werkzeug für eine KI: my_space

Beispielantwort
{
  "tierLists": [],
  "builds": [],
  "training": {
    "focus": [],
    "notes": [],
    "combos": [],
    "reflex": {
      "streak": 0,
      "best": {}
    }
  },
  "links": [],
  "limits": {
    "builds": 300,
    "buildsPerHero": 30,
    "links": 20,
    "days": [
      7
    ]
  }
}

Dein Konto account

GET/api/v1/meDein Konto

Who the key belongs to (tag and name, never the email), its scopes and its expiry.

Werkzeug für eine KI: whoami

Beispielantwort
{
  "account": {
    "tag": "YHX7EA",
    "name": "Kai"
  },
  "key": {
    "id": "25bf6418-4cbf-448a-baed-30349809947e",
    "name": "Stats bot",
    "scopes": [
      "game",
      "competitive"
    ],
    "expiresAt": 1801253503341
  }
}

Exportieren

Gestalteter Bericht · wieder importierbar

Format

Die Datei enthält die Seriendaten: Importiere sie über Scrims → Serie importieren zurück. Speichere oder drucke sie nicht neu, sonst gehen die Daten verloren.