HOK API: data Honor of Kings untuk program Anda

Baca hero, item, arcana, spell, tier list, dan draft turnamen Honor of Kings Global, serta scrim Anda sendiri, dari program atau asisten AI. Hanya baca, gratis, dengan kunci.

Dapatkan kunci

Autentikasi

Setiap alamat membutuhkan kunci API yang dikirim sebagai token bearer. Kunci hanya membaca dan melihat apa yang dilihat pemiliknya: data game untuk semua orang, scrim, tier list, dan tim Anda untuk Anda.

Panggilan pertama Anda
curl -H "Authorization: Bearer hok_YOUR_KEY" http://127.0.0.1:3000/api/v1/heroes

Header X-API-Key juga bisa. Kunci di dalam alamat diabaikan: alamat berakhir di log.

Batas dan galat

Setiap kunci boleh membuat 120 permintaan per menit. Galat berupa JSON dengan kode tetap:

StatuscodeArti
400invalid_bodySituasi yang dikirim ke satu-satunya POST tidak valid: galatnya menyebutkan apa yang salah.
401unauthorizedTidak ada kunci, atau kunci tidak valid, kedaluwarsa, atau dicabut.
403insufficient_scopeKunci tidak memiliki cakupan yang dibutuhkan alamat ini.
404not_foundAlamat tidak dikenal, atau sesuatu yang tidak dapat dilihat pemilik kunci.
405method_not_allowedAPI hanya untuk membaca: gunakan GET.
429rate_limitedTerlalu banyak permintaan: tunggu sesuai detik di Retry-After.

Gunakan dengan AI

API juga merupakan server MCP, di http://127.0.0.1:3000/api/v1/mcp: asisten mendapat satu alat per alamat yang dapat dibaca kuncinya.

Buat satu kunci untuk setiap asisten, hanya dengan yang dibutuhkan (data publik game sudah cukup untuk bertanya soal hero, item, dan draft). Jika satu bocor, cabut tanpa menyentuh yang lain.

Claude Code

Jalankan ini di terminal:

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

Tambahkan ini ke claude_desktop_config.json (Settings, Developer, Edit config), lalu mulai ulang Claude. Memerlukan Node.js.

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

Tambahkan ini ke .cursor/mcp.json, di proyek Anda atau di folder home:

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

ChatGPT

Di GPT kustom: Configure, Create new action, Import from URL dengan alamat ini. Lalu Authentication: API key, tipe Bearer, dan tempel kunci Anda.

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

Ganti hok_YOUR_KEY dengan kunci Anda. Asisten lalu melihat satu alat per alamat yang dapat dibaca kunci Anda, dan hanya membaca.

Alamat

Deskripsi lengkap, untuk diimpor ke sebuah alat: /api/v1/openapi.json (OpenAPI 3.1)

Data game game

GET/api/v1/heroesData game

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

Alat untuk AI: list_heroes

Contoh jawaban
{
  "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}Data game

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

Alat untuk AI: get_hero

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
sincekueriCount the tournament games from this day on, YYYY-MM-DD.
Contoh jawaban
{
  "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-listData game

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

Alat untuk AI: get_tier_list

Contoh jawaban
{
  "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/catalogData game

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

Alat untuk AI: get_catalog

Contoh jawaban
{
  "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}Data game

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

Alat untuk AI: list_catalog_family

ParameterLetakDeskripsi
family wajibalamatitems, arcana, spells, stats or tags.
Contoh jawaban
{
  "spells": [
    {
      "id": 1,
      "name": "Flash",
      "imageId": null,
      "description": "Blink a short distance.",
      "cooldownSeconds": 120,
      "unlockLevel": null
    }
  ]
}
GET/api/v1/catalog/{family}/{id}Data game

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

Alat untuk AI: get_catalog_entry

ParameterLetakDeskripsi
family wajibalamatitems, arcana, spells, stats or tags.
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "id": 1,
  "name": "Flash",
  "imageId": null,
  "description": "Blink a short distance.",
  "cooldownSeconds": 120,
  "unlockLevel": null
}

Skena kompetitif competitive

GET/api/v1/tournamentsSkena kompetitif

The tournament series entered by the staff.

Alat untuk AI: list_tournaments

ParameterLetakDeskripsi
qkueriWords to look for.
pagekueriThe page of the list, from 1.
Contoh jawaban
{
  "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}Skena kompetitif

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

Alat untuk AI: get_tournament

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "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
    }
  ]
}

Scrim Anda scrims

GET/api/v1/seriesScrim Anda

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

Alat untuk AI: list_series

ParameterLetakDeskripsi
pagekueriThe page of the list, from 1.
pageSizekueriHow many entries a page holds.
viewkuerisummary (lighter) or full.
sortkueriupdated, oldest or created.
statuskueriactive, complete or draw.
modekueriThe game mode: global-ban-pick, free-for-all or classic.
draftModekueriThe draft mode of the series.
qkueriWords to look for.
fromkueriThe first day, YYYY-MM-DD.
tokueriThe last day, YYYY-MM-DD.
Contoh jawaban
{
  "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}Scrim Anda

One series with every game of it.

Alat untuk AI: get_series

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "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/overviewScrim Anda

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

Alat untuk AI: scrim_stats_overview

ParameterLetakDeskripsi
statuskueriactive, complete or draw.
modekueriThe game mode: global-ban-pick, free-for-all or classic.
draftModekueriThe draft mode of the series.
qkueriWords to look for.
fromkueriThe first day, YYYY-MM-DD.
tokueriThe last day, YYYY-MM-DD.
minGameskueriThe fewest games a figure needs to be shown.
Contoh jawaban
{
  "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/heroesScrim Anda

The per-hero statistics of your scrims.

Alat untuk AI: scrim_stats_heroes

ParameterLetakDeskripsi
statuskueriactive, complete or draw.
modekueriThe game mode: global-ban-pick, free-for-all or classic.
draftModekueriThe draft mode of the series.
qkueriWords to look for.
fromkueriThe first day, YYYY-MM-DD.
tokueriThe last day, YYYY-MM-DD.
minGameskueriThe fewest games a figure needs to be shown.
pagekueriThe page of the list, from 1.
pageSizekueriHow many entries a page holds.
orderkueriHow the heroes are sorted (presence by default).
herokueriOnly the heroes whose name holds these letters.
Contoh jawaban
{
  "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}/scrimsScrim Anda

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

Alat untuk AI: hero_scrim_stats

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "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": []
}

Tier list kamu tier-lists

GET/api/v1/tier-listsTier list kamu

Your tier lists, and the ones shared with you.

Alat untuk AI: list_my_tier_lists

ParameterLetakDeskripsi
pagekueriThe page of the list, from 1.
pageSizekueriHow many entries a page holds.
lanekueriOnly the lists of one lane.
qkueriWords to look for.
Contoh jawaban
{
  "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}Tier list kamu

One tier list with its placements.

Alat untuk AI: get_my_tier_list

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "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
  }
}

Timmu teams

GET/api/v1/me/teamsTimmu

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

Alat untuk AI: my_teams

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

The teams of the community.

Alat untuk AI: list_teams

ParameterLetakDeskripsi
qkueriWords to look for.
pagekueriThe page of the list, from 1.
pageSizekueriHow many entries a page holds.
levelkueriOnly the teams of one level.
regionkueriOnly the teams of one region.
Contoh jawaban
{
  "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}Timmu

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

Alat untuk AI: get_team

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "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}/eventsTimmu

The agenda of one of your teams.

Alat untuk AI: team_events

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "items": [
    {
      "id": "2b9c0e3a-6f0d-4a8e-b1c2-3d4e5f6a7b8c",
      "title": "Scrim vs Bravo",
      "startsAt": 1793563200000
    }
  ],
  "canSchedule": true
}
GET/api/v1/teams/{id}/seriesTimmu

The series that this team shared with its members.

Alat untuk AI: team_series

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "items": [],
  "total": 0,
  "page": 1,
  "pageSize": 20
}
GET/api/v1/me/agendaTimmu

Your agenda: the events of all your teams.

Alat untuk AI: my_agenda

ParameterLetakDeskripsi
fromkueriThe start of the window, in milliseconds since 1970.
tokueriThe end of the window, in milliseconds since 1970.
Contoh jawaban
{
  "items": [
    {
      "id": "2b9c0e3a-6f0d-4a8e-b1c2-3d4e5f6a7b8c",
      "title": "Scrim vs Bravo",
      "startsAt": 1793563200000
    }
  ]
}

Latihanmu training

GET/api/v1/training/focusLatihanmu

The heroes you work on.

Alat untuk AI: training_focus

Contoh jawaban
{
  "heroIds": [
    "h105",
    "h120"
  ]
}
GET/api/v1/training/notesLatihanmu

Your training notebook.

Alat untuk AI: training_notes

Contoh jawaban
{
  "notes": []
}
GET/api/v1/training/combosLatihanmu

The combos you have acquired.

Alat untuk AI: training_combos

Contoh jawaban
{
  "progress": {}
}
GET/api/v1/training/combos/reviewLatihanmu

The combos that are due for a check.

Alat untuk AI: training_combos_due

Contoh jawaban
{
  "now": 1793477503716,
  "due": [],
  "dueTotal": 0,
  "toLearn": [],
  "toLearnTotal": 0,
  "skills": {}
}
GET/api/v1/training/mapsLatihanmu

The maps of the situations.

Alat untuk AI: training_maps

Contoh jawaban
{
  "maps": []
}
GET/api/v1/training/scenariosLatihanmu

The situations prepared by the staff.

Alat untuk AI: list_training_scenarios

Contoh jawaban
{
  "scenarios": []
}
GET/api/v1/training/scenarios/{id}Latihanmu

One situation.

Alat untuk AI: get_training_scenario

ParameterLetakDeskripsi
id wajibalamatThe id of the thing.
Contoh jawaban
{
  "id": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
  "title": "Defend the second tower",
  "mapId": "main"
}
GET/api/v1/training/reflexLatihanmu

Your reflex training results.

Alat untuk AI: training_reflex

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

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

Alat untuk AI: my_space

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

Akunmu account

GET/api/v1/meAkunmu

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

Alat untuk AI: whoami

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

Ekspor

Laporan bergaya · dapat diimpor ulang

Format

File ini berisi data seri: impor kembali dari Scrim → Impor seri. Jangan simpan ulang atau cetak, atau datanya hilang.