HOK API: 프로그램을 위한 Honor of Kings 데이터
Honor of Kings Global의 영웅, 아이템, 아르카나, 주문, 티어 리스트, 대회 드래프트와 당신의 스크림을 프로그램이나 AI 어시스턴트에서 읽으세요. 읽기 전용, 무료, 키로 사용.
키 받기
인증
모든 주소에는 bearer 토큰으로 보내는 API 키가 필요합니다. 키는 읽기만 하며 소유자가 보는 것만 봅니다: 모두를 위한 게임 데이터, 그리고 당신의 스크림, 티어 리스트, 팀.
첫 번째 호출curl -H "Authorization: Bearer hok_YOUR_KEY" http://127.0.0.1:3000/api/v1/heroes
X-API-Key 헤더도 됩니다. 주소에 넣은 키는 무시됩니다: 주소는 로그에 남기 때문입니다.
제한과 오류
키마다 분당 120개의 요청을 보낼 수 있습니다. 오류는 고정 코드가 있는 JSON입니다:
| 상태 | code | 의미 |
|---|
| 400 | invalid_body | 유일한 POST로 보낸 상황이 올바르지 않습니다: 오류가 무엇이 잘못됐는지 알려 줍니다. |
| 401 | unauthorized | 키가 없거나, 유효하지 않거나 만료 또는 취소된 키입니다. |
| 403 | insufficient_scope | 키에 이 주소가 요구하는 범위가 없습니다. |
| 404 | not_found | 알 수 없는 주소이거나 키 소유자가 볼 수 없는 항목입니다. |
| 405 | method_not_allowed | API는 읽기 전용입니다. GET을 사용하세요. |
| 429 | rate_limited | 요청이 너무 많습니다: Retry-After의 초만큼 기다리세요. |
AI와 함께 쓰기
API는 http://127.0.0.1:3000/api/v1/mcp의 MCP 서버이기도 합니다: 어시스턴트는 키가 읽을 수 있는 주소마다 도구 하나를 받습니다.
어시스턴트마다 필요한 것만 담은 키를 하나씩 만드세요(영웅, 아이템, 드래프트를 묻는 데는 게임 공개 데이터로 충분합니다). 하나가 유출되면 다른 키는 건드리지 않고 그 키만 취소하세요.
Claude Code
터미널에서 다음을 실행하세요:
Terminalclaude mcp add --transport http hok-api http://127.0.0.1:3000/api/v1/mcp --header "Authorization: Bearer hok_YOUR_KEY"
Claude Desktop
claude_desktop_config.json(Settings, Developer, Edit config)에 추가한 뒤 Claude를 다시 시작하세요. 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
프로젝트나 홈 폴더의 .cursor/mcp.json에 추가하세요:
.cursor/mcp.json{
"mcpServers": {
"hok-api": {
"url": "http://127.0.0.1:3000/api/v1/mcp",
"headers": {
"Authorization": "Bearer hok_YOUR_KEY"
}
}
}
}
ChatGPT
맞춤 GPT에서: Configure, Create new action, 이 주소로 Import from URL. 그다음 Authentication: API key, 유형 Bearer를 고르고 키를 붙여 넣으세요.
OpenAPIhttp://127.0.0.1:3000/api/v1/openapi.json
hok_YOUR_KEY를 자신의 키로 바꾸세요. 어시스턴트는 키가 읽을 수 있는 주소마다 도구 하나를 보게 되며, 읽기만 합니다.
주소
도구에 가져올 전체 설명: /api/v1/openapi.json (OpenAPI 3.1)
게임 데이터 game
The heroes of the Global roster (name, classes, lanes, picture).
AI용 도구: list_heroes
응답 예시
{
"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}게임 데이터
One hero: its sheet (skills, art), its recommended builds, its combos, its official ratings and the competitive figures.
AI용 도구: get_hero
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
since | 쿼리 | Count the tournament games from this day on, YYYY-MM-DD. |
응답 예시
{
"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-list게임 데이터
The public tier list of each lane: tournament results first, the editors' ratings for the heroes played too little.
AI용 도구: get_tier_list
응답 예시
{
"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"
}
The items, the arcana, the battle spells, the stats and the tags of the game, in one answer.
AI용 도구: get_catalog
응답 예시
{
"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}게임 데이터
One family of the catalogue: items, arcana, spells, stats or tags.
AI용 도구: list_catalog_family
| 매개변수 | 위치 | 설명 |
|---|
family 필수 | 주소 | items, arcana, spells, stats or tags. |
응답 예시
{
"spells": [
{
"id": 1,
"name": "Flash",
"imageId": null,
"description": "Blink a short distance.",
"cooldownSeconds": 120,
"unlockLevel": null
}
]
}
GET/api/v1/catalog/{family}/{id}게임 데이터
One item, arcana, spell, stat or tag, by its number: everything its page shows (stats and tags by their number).
AI용 도구: get_catalog_entry
| 매개변수 | 위치 | 설명 |
|---|
family 필수 | 주소 | items, arcana, spells, stats or tags. |
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"id": 1,
"name": "Flash",
"imageId": null,
"description": "Blink a short distance.",
"cooldownSeconds": 120,
"unlockLevel": null
}
대회 씬 competitive
GET/api/v1/tournaments대회 씬
The tournament series entered by the staff.
AI용 도구: list_tournaments
| 매개변수 | 위치 | 설명 |
|---|
q | 쿼리 | Words to look for. |
page | 쿼리 | The page of the list, from 1. |
응답 예시
{
"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}대회 씬
One tournament series with all its games: bans, picks, lanes, winner, duration.
AI용 도구: get_tournament
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"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
}
]
}
GET/api/v1/popular/drafts대회 씬
The drafts that win and are played most in the tournament games.
AI용 도구: popular_drafts
| 매개변수 | 위치 | 설명 |
|---|
from | 쿼리 | The first day of the period, YYYY-MM-DD (the period spans 3 months at least). |
to | 쿼리 | The last day of the period, YYYY-MM-DD. |
rule | 쿼리 | Only the games of one draft rule (empty: every rule). |
minGames | 쿼리 | The fewest games a draft or a hero needs to be ranked, 1 to 50. |
응답 예시
{
"period": {
"from": "2026-08-01",
"to": "2026-10-31",
"first": "2026-08-03",
"last": "2026-10-30",
"minMonths": 3
},
"rule": "",
"rules": [
"classic"
],
"minGames": 1,
"totalGames": 120,
"sides": {
"blue": {
"different": 80,
"groups": 12,
"eligible": 9,
"byWinRate": [],
"byPlays": []
},
"red": {
"different": 77,
"groups": 11,
"eligible": 8,
"byWinRate": [],
"byPlays": []
}
},
"duos": {
"all": [],
"mostPlayed": [],
"byLanes": {}
}
}
GET/api/v1/popular/heroes대회 씬
The heroes that win and are played most in the tournament games, by lane.
AI용 도구: popular_heroes
| 매개변수 | 위치 | 설명 |
|---|
from | 쿼리 | The first day of the period, YYYY-MM-DD (the period spans 3 months at least). |
to | 쿼리 | The last day of the period, YYYY-MM-DD. |
rule | 쿼리 | Only the games of one draft rule (empty: every rule). |
minGames | 쿼리 | The fewest games a draft or a hero needs to be ranked, 1 to 50. |
응답 예시
{
"period": {
"from": "2026-08-01",
"to": "2026-10-31",
"first": "2026-08-03",
"last": "2026-10-30",
"minMonths": 3
},
"rule": "",
"rules": [
"classic"
],
"minGames": 1,
"totalGames": 120,
"lanes": [
{
"lane": "Farm Lane",
"picks": 120,
"all": {
"different": 14,
"eligible": 9,
"byWinRate": [],
"byPlays": [],
"byPresence": []
}
}
],
"placed": 1180,
"unplaced": 20,
"games": 120
}
내 스크림 scrims
Your series, and the ones a team of yours shared.
AI용 도구: list_series
| 매개변수 | 위치 | 설명 |
|---|
page | 쿼리 | The page of the list, from 1. |
pageSize | 쿼리 | How many entries a page holds. |
view | 쿼리 | summary (lighter) or full. |
sort | 쿼리 | updated, oldest or created. |
status | 쿼리 | active, complete or draw. |
mode | 쿼리 | The game mode: global-ban-pick, free-for-all or classic. |
draftMode | 쿼리 | The draft mode of the series. |
q | 쿼리 | Words to look for. |
from | 쿼리 | The first day, YYYY-MM-DD. |
to | 쿼리 | The last day, YYYY-MM-DD. |
응답 예시
{
"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}내 스크림
One series with every game of it.
AI용 도구: get_series
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"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/overview내 스크림
The statistics of your scrims (figures under the minimum sample are withheld).
AI용 도구: scrim_stats_overview
| 매개변수 | 위치 | 설명 |
|---|
status | 쿼리 | active, complete or draw. |
mode | 쿼리 | The game mode: global-ban-pick, free-for-all or classic. |
draftMode | 쿼리 | The draft mode of the series. |
q | 쿼리 | Words to look for. |
from | 쿼리 | The first day, YYYY-MM-DD. |
to | 쿼리 | The last day, YYYY-MM-DD. |
minGames | 쿼리 | The fewest games a figure needs to be shown. |
응답 예시
{
"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/heroes내 스크림
The per-hero statistics of your scrims.
AI용 도구: scrim_stats_heroes
| 매개변수 | 위치 | 설명 |
|---|
status | 쿼리 | active, complete or draw. |
mode | 쿼리 | The game mode: global-ban-pick, free-for-all or classic. |
draftMode | 쿼리 | The draft mode of the series. |
q | 쿼리 | Words to look for. |
from | 쿼리 | The first day, YYYY-MM-DD. |
to | 쿼리 | The last day, YYYY-MM-DD. |
minGames | 쿼리 | The fewest games a figure needs to be shown. |
page | 쿼리 | The page of the list, from 1. |
pageSize | 쿼리 | How many entries a page holds. |
order | 쿼리 | How the heroes are sorted (presence by default). |
hero | 쿼리 | Only the heroes whose name holds these letters. |
응답 예시
{
"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}/scrims내 스크림
What your scrims say of one hero: picks, bans, synergies, matchups.
AI용 도구: hero_scrim_stats
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"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-lists
GET/api/v1/tier-lists내 티어 리스트
Your tier lists, and the ones shared with you.
AI용 도구: list_my_tier_lists
| 매개변수 | 위치 | 설명 |
|---|
page | 쿼리 | The page of the list, from 1. |
pageSize | 쿼리 | How many entries a page holds. |
lane | 쿼리 | Only the lists of one lane. |
q | 쿼리 | Words to look for. |
응답 예시
{
"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}내 티어 리스트
One tier list with its placements.
AI용 도구: get_my_tier_list
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"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
}
}
내 팀 teams
The teams you belong to, with your role in each.
AI용 도구: my_teams
응답 예시
{
"items": [
{
"id": "07db7f13-4df0-4d4e-b6c9-453d26c41fe5",
"name": "Learn Squad",
"tag": "LERN",
"region": "EU",
"level": "amateur",
"memberCount": 5,
"myRole": "owner"
}
]
}
The teams of the community.
AI용 도구: list_teams
| 매개변수 | 위치 | 설명 |
|---|
q | 쿼리 | Words to look for. |
page | 쿼리 | The page of the list, from 1. |
pageSize | 쿼리 | How many entries a page holds. |
level | 쿼리 | Only the teams of one level. |
region | 쿼리 | Only the teams of one region. |
응답 예시
{
"items": [
{
"id": "07db7f13-4df0-4d4e-b6c9-453d26c41fe5",
"name": "Learn Squad",
"tag": "LERN",
"region": "EU",
"level": "amateur",
"memberCount": 5
}
],
"total": 1,
"page": 1,
"pageSize": 18
}
One team: its members and its settings that you may see.
AI용 도구: get_team
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"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}/events내 팀
The agenda of one of your teams.
AI용 도구: team_events
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"items": [
{
"id": "2b9c0e3a-6f0d-4a8e-b1c2-3d4e5f6a7b8c",
"title": "Scrim vs Bravo",
"startsAt": 1793563200000
}
],
"canSchedule": true
}
GET/api/v1/teams/{id}/series내 팀
The series that this team shared with its members.
AI용 도구: team_series
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"items": [],
"total": 0,
"page": 1,
"pageSize": 20
}
Your agenda: the events of all your teams.
AI용 도구: my_agenda
| 매개변수 | 위치 | 설명 |
|---|
from | 쿼리 | The start of the window, in milliseconds since 1970. |
to | 쿼리 | The end of the window, in milliseconds since 1970. |
응답 예시
{
"items": [
{
"id": "2b9c0e3a-6f0d-4a8e-b1c2-3d4e5f6a7b8c",
"title": "Scrim vs Bravo",
"startsAt": 1793563200000
}
]
}
나의 트레이닝 training
GET/api/v1/training/focus나의 트레이닝
The heroes you work on.
AI용 도구: training_focus
응답 예시
{
"heroIds": [
"h105",
"h120"
]
}
GET/api/v1/training/notes나의 트레이닝
Your training notebook.
AI용 도구: training_notes
응답 예시
{
"notes": []
}
GET/api/v1/training/combos나의 트레이닝
The combos you have acquired.
AI용 도구: training_combos
응답 예시
{
"progress": {}
}
GET/api/v1/training/combos/review나의 트레이닝
The combos that are due for a check.
AI용 도구: training_combos_due
응답 예시
{
"now": 1793477503716,
"due": [],
"dueTotal": 0,
"toLearn": [],
"toLearnTotal": 0,
"skills": {}
}
GET/api/v1/training/maps나의 트레이닝
The maps of the situations.
AI용 도구: training_maps
응답 예시
{
"maps": []
}
GET/api/v1/training/scenarios나의 트레이닝
The situations prepared by the staff.
AI용 도구: list_training_scenarios
응답 예시
{
"scenarios": []
}
GET/api/v1/training/scenarios/{id}나의 트레이닝
One situation.
AI용 도구: get_training_scenario
| 매개변수 | 위치 | 설명 |
|---|
id 필수 | 주소 | The id of the thing. |
응답 예시
{
"id": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
"title": "Defend the second tower",
"mapId": "main"
}
GET/api/v1/training/reflex나의 트레이닝
Your reflex training results.
AI용 도구: training_reflex
응답 예시
{
"exercises": {
"reaction": {
"runs": 12,
"best": 231,
"last": []
}
},
"doneToday": [],
"today": {
"runs": 3,
"minutes": 4
},
"week": {
"runs": 12,
"minutes": 18
},
"streak": 2,
"teams": []
}
Your personal space (the builds and notes you keep).
AI용 도구: my_space
응답 예시
{
"tierLists": [],
"builds": [],
"training": {
"focus": [],
"notes": [],
"combos": [],
"reflex": {
"streak": 0,
"best": {}
}
},
"links": [],
"limits": {
"builds": 300,
"buildsPerHero": 30,
"links": 20,
"days": [
7
]
}
}
내 계정 account
Who the key belongs to (tag and name, never the email), its scopes and its expiry.
AI용 도구: whoami
응답 예시
{
"account": {
"tag": "YHX7EA",
"name": "Kai"
},
"key": {
"id": "25bf6418-4cbf-448a-baed-30349809947e",
"name": "Stats bot",
"scopes": [
"game",
"competitive"
],
"expiresAt": 1801253503341
}
}