1. 概要
n01のトーナメント・リーグ・マッチ・チームオーダー・集計結果を外部システムから取得/更新するためのHTTP APIです。
- データ取得APIは認証なしで利用できます。公開画面と同じ範囲のデータのみ返します (非公開の項目は返しません。一覧は非公開/削除済みのものを除外します)。 Basic認証を付けると、自分が管理者の大会に限り管理用の項目も返します (5. 認証)。
- データの作成・更新・削除APIはBasic認証が必要です。操作できるのは 自分が管理者のトーナメント・リーグだけです (5. 認証)。
- レスポンスはすべてJSONです。成功時は
{"result":0, ...}、失敗時は{"result":<負の値>, "error":"..."}を返します (7. resultコード一覧)。 - ベースURLは
https://push.n01darts.com/api/v1です (例:https://push.n01darts.com/api/v1/tournament/list)。 - CORSに対応しているため、ブラウザ上のJavaScriptから直接呼び出せます。
2. データ取得API (認証は任意)
取得APIはBasic認証を付けずに利用できます (autopilot/get autopilot/list と
team/player/list?all=1 だけは管理者のBasic認証が必要です)。付けた場合は、認証したユーザーが管理者になっている
トーナメント・リーグに限り admin_id admin_name join_pass
scorer_pass も返し (tournament/get league/get では常に含み、一覧APIでは
fields に明示したときだけ返します)、一覧には自分の非公開の大会も含めます
(5. 認証)。認証情報が誤っている場合は result: -40 を返します。
同じ送信元・同じユーザー名で認証の失敗が続くと (10分間に20回)、正しいパスワードでもしばらく拒否されます。
GET/api/v1/health
死活監視用。サーバの稼働状態を返します。
GET/api/v1/tournament/list
トーナメントの一覧を返します。非公開 (private) と削除済みのものは返しません。
Basic認証を付けると自分が管理者の非公開の大会も含めます (owner=1 で自分が管理者の大会だけに絞れます)。
一覧の共通パラメータで絞り込み・並べ替え・ページングができます。
| 絞り込みに使えるfield | tdid lgid title t_date status kind softdarts league game_type createTime updateTime |
|---|---|
| keyword | タイトルのキーワード検索 (空白区切りでAND) |
| sortに使えるfield | createTime (既定・降順) updateTime t_date status title |
| 既定で返すfield | tdid lgid createTime updateTime title t_date status kind |
| fieldsで追加できるfield | 上記に加えて softdarts league game_type details image color theme theme_css oom win_lose sd_legs。
Basic認証付きなら自分が管理者の大会について admin_id admin_name join_pass scorer_pass も指定できる |
GET /api/v1/tournament/list?status__in=20,30&sort=createTime&order=desc&count=20
{"result":0, "list":[
{"tdid":"...", "lgid":"...", "createTime":1700000000, "updateTime":1700000001000,
"title":"Spring Open", "t_date":1775001600, "status":30, "kind":"darts"},
...
]}
GET/api/v1/tournament/get
トーナメント1件の全データを返します。
tdid | 必須。トーナメントID |
|---|---|
entry | 0 を指定すると entry_list を省略する (既定は含む) |
レスポンスの tournament にトーナメント文書 (対戦表 table や設定を含む) が入ります。
非公開の項目は含まれません。自分が管理者のトーナメントをBasic認証付きで取得した場合は
admin_id admin_name join_pass scorer_pass も含みます。
レスポンスには参加者・観戦者が開くページの url
(https://n01darts.com/n01/tournament/comp.php?id=<tdid>。リーグ配下のイベントは
https://n01darts.com/n01/league/season.php?id=<tdid>) も入ります。
{"result":0, "tournament":{...}, "url":"https://n01darts.com/n01/tournament/comp.php?id=t_Ab1c_2345"}
GET/api/v1/tournament/entry/list
エントリーの一覧を返します。tdid が必須です。
各エントリーは tpid name と、設定されていれば sns_type join
startScore c (国) index を持ちます。非公開の項目は返しません。
そのトーナメントの管理者のBasic認証を付けると、個別パスワードが設定されているかを表す pass_set (0 / 1)
も付きます (パスワードそのものは返しません。/api/v1/tournament/get の entry_list も同じ)。
GET/api/v1/tournament/stats
トーナメントの集計結果を返します。tdid が必須です。
kind |
stats_list (既定) — チーム/プレーヤー単位の集計player_stats_list — 選手単位の集計 (チーム戦)player_high_out — ハイアウトplayer_high_in — ハイインplayer_best_leg — ベストレッグrr_stats_list — ラウンドロビンのブロック別の選手集計lg_stats_list — リーグ形式のディビジョン別の選手集計
|
|---|
集計は既存の集計画面と同じ内容を返します。レスポンスの stats に集計データが入ります。
GET/api/v1/league/list
リーグの一覧を返します。非公開・削除済みのものは返しません。
Basic認証を付けると自分が管理者の非公開のリーグも含めます (owner=1 で自分が管理者のリーグだけに絞れます)。
| 絞り込みに使えるfield | lgid title status createTime updateTime |
|---|---|
| keyword | タイトルのキーワード検索 |
| sortに使えるfield | createTime (既定・降順) updateTime title status |
| 既定で返すfield | lgid createTime updateTime title status |
| fieldsで追加できるfield | 上記に加えて details image theme theme_css ad。
Basic認証付きなら自分が管理者のリーグについて admin_id admin_name join_pass scorer_pass も指定できる |
GET/api/v1/league/get
リーグ1件の全データを返します。lgid が必須です。
トーナメントと同様に非公開の項目は含まれません。
レスポンスにはリーグのポータルページの url
(https://n01darts.com/n01/league/portal.php?lgid=<lgid>) も入ります。
{"result":0, "league":{...}, "url":"https://n01darts.com/n01/league/portal.php?lgid=lg_Ab1c_2345"}
GET/api/v1/league/entry/list
リーグのエントリー一覧を返します。lgid が必須です。
各エントリーは lpid name と、設定されていれば c sns_type を持ちます。
GET/api/v1/league/tournament/list
リーグ配下のイベント (トーナメント) の一覧を返します。lgid が必須です。
パラメータは /api/v1/tournament/list と同じです (ただし owner と admin_id は使えません。指定しても無視されます)。
リーグのポータルと同様、配下の非公開イベントも返します (削除済みは除外)。
GET/api/v1/match/list
マッチの一覧を返します。非公開・削除済みのものは返しません。 既定ではアーカイブ (進行中のものを含む全マッチが同期されている) を検索します。
| 絞り込みに使えるfield | mid tdid tmid schid scid match_type endMatch endSchedule relayMode title startTime |
|---|---|
player | プレーヤー名の部分一致 (大文字小文字を区別しない)。tdid と組み合わせて指定します (tdid が無いと -51) |
live | 1 を指定すると進行中 (アーカイブへの整理前) のマッチだけを検索する |
| sortに使えるfield | startTime (既定・降順) updateTime |
| 既定で返すfield | mid tdid tmid schid scid match_type title startTime endMatch statsData |
| fieldsで追加できるfield | 上記に加えて endSchedule relayMode settings currentSet currentLeg updateTime |
match_type は "01" か "cricket" です。無い (未設定の) マッチは 01 です。
GET/api/v1/match/get
マッチ1件の全データ (レッグごとのスコアを含む) を返します。mid が必須です。
アーカイブを基本に取得し、無い場合は進行中のマッチから探します。削除済みのマッチは返しません。
非公開のマッチ (private = 1) は、そのマッチが属するトーナメントの管理者 (Basic認証) にだけ返し、
それ以外には -1 を返します。
非公開の項目は含まれません。statsData 内のSNS連携のIDは有無を表す "1" にマスクされます。
GET/api/v1/team/order/list
チーム戦のオーダー一覧を返します。
tdid | 必須。トーナメントID |
|---|---|
tmid tpid schid | 任意。指定すると絞り込む |
各要素は tmid tpid schid fix (オーダー確定済みか) と、
オーダーが提出されていれば order (選手の並び。oid opid oname を選手一覧から補完して返す)、
結果が入力されていれば res を持ちます。
GET/api/v1/team/player/list
チームの選手一覧を返します。tdid が必須、tpid は任意 (省略時は全チーム)。
削除済みの選手は返しません。各選手は tpid oid opid oname と、設定されていれば index を持ちます
(index の無い選手は末尾に並びます)。
all=1 を付けると削除済みの選手も delete 付きで返します
(そのトーナメントの管理者のBasic認証が必要です)。
GET/api/v1/tournament/standings
リーグ形式 (lg) とラウンドロビン (rr) の順位表を返します。tdid が必須です。
順位の計算は画面 (対戦表・チーム出力画面) と同じ規則で、勝ち点・ブッフホルツ・勝敗差・レグ差・直接対決まで含みます。
リーグ形式もラウンドロビンも無い大会は result: -51 です。
{"result":0, "tdid":"...", "groups":[
{"kind":"lg", "index":0, "title":"Division 1", "players":[
{"tpid":"aaaa", "name":"Player One", "rank":1, "p":3, "w":3, "d":0, "l":0, "diff":6, "diff_l":0, "pts":6, "bh":4, "byes":0},
...
]}
]}
players は順位順です。まだ試合をしていない選手は rank が 0 で末尾に並びます。
p 試合数 / w d l 勝・分・負 / diff レグ差 (セット制のときはセット差) /
diff_l セット制のレグ差 / pts 勝ち点 / bh ブッフホルツ (スイス式で有効なとき) / byes 不戦勝の数。
勝ち点には管理画面で手動で加えた加点 (lg_pts、勝ち点制のラウンドロビンでは rr_pts)、結果に付けた加点 (add)、
ゲームごとの加点 (チーム戦の pt) も含みます (画面の順位表と同じ)。勝ち点制でないラウンドロビンは
win lose leg_win leg_lose で順位を付け、pts はありません。
GET/api/v1/tournament/end_group
ラウンドロビンの各ブロック (rr_<index>) とリーグ形式の各ディビジョン (lg_<index>) の
全試合が終了しているか (1 = 終了、0 = 未終了) を返します。決勝トーナメントへの割当の前の確認に使います。
{"result":0, "tdid":"...", "groups":{"rr_0":1, "rr_1":0}}
GET/api/v1/league/schedule/get
リーグ形式の対戦カード (フィクスチャ) を返します。tdid が必須、div (ディビジョンの添字) は任意です
(省略するとディビジョンごとの配列を返します)。
{"result":0, "tdid":"...", "swiss":0, "schedule":[
[{"p":["aaaa","bbbb"], "lsid":"ab3f", "t":""}, {"p":["cccc","dddd"], "lsid":"k9x2", "t":"", "r":1}],
[]
]}
| field | 意味 |
|---|---|
p | 対戦する2つの tpid。"" は未設定の枠、"empty" は不戦勝の相手 |
lsid | カードのID (4文字)。結果は lg_result["<div>_<lsid>"] に入る |
t | カードのタイトル |
r | スイス式のラウンド番号 (1始まり) |
スイス式のリーグでは swiss が 1 で、rounds にディビジョンごとの現在のラウンド (round)、
総ラウンド数 (total)、現在のラウンドの未配置の枠数 (blank)、人数 (members) が入ります。
GET/api/v1/league/stats
リーグ (配下の全イベント) の集計を返します。lgid が必須です。
kind は stats_list (既定)、player_stats_list、rank_list、t_list で、
リーグの集計画面と同じJSONを stats に入れて返します。
GET/api/v1/autopilot/get
自動進行 (空いた台への試合の自動割当) の設定と、自動進行サーバが書いた状態を返します。tdid が必須で、
そのトーナメントの管理者のBasic認証が必要です。
{"result":0, "tdid":"...",
"config":{"tdid":"...", "lgid":"...", "group":"...", "name_control":0, "name_mode":"auto", "priority":0, "hold_robin":0,
"types":{"t":{"badge_number":"1-10", "break_time":0, "round":0, "enable":1}, "s2":{...}, "dw":{...}, "dl":{...}},
"remove_old_badge":1, "set_referee":0, "referee_type":"same_board", "updateTime":1700000000000},
"status":{"time":1700000000000, "error":"", "held":{...}}}
設定が無ければ config は null です。status.held は自動で盤を入れなかった試合の一覧
(相手未定・盤待ち・試合中・休憩中の理由付き) で、設定画面の保留一覧と同じ内容です。
GET/api/v1/autopilot/list
リーグ配下の全イベントの自動進行の設定と状態を返します。lgid が必須で、そのリーグの管理者のBasic認証が必要です。
各要素は tdid title status (トーナメントの状態) と config / status (上と同じ) を持ちます。
3. 一覧の共通パラメータ
一覧API (.../list) は、多数の条件を組み合わせられるよう以下の形式のクエリパラメータを受け付けます。
| パラメータ | 意味 | 例 |
|---|---|---|
<field>=<値> | 完全一致 | status=30 |
<field>__ne=<値> | 不一致 | match_type__ne=cricket |
<field>__gt / __gte=<値> | より大きい / 以上 | startTime__gte=1700000000 |
<field>__lt / __lte=<値> | より小さい / 以下 | updateTime__lt=1700000000000 |
<field>__in=<値,値,...> | いずれかに一致 | status__in=20,30 |
<field>__nin=<値,値,...> | いずれにも一致しない | status__nin=40 |
<field>__exists=0|1 | フィールドの有無 | lgid__exists=1 |
<field>__regex=<語> | 部分一致 (大文字小文字を区別しない。文字列のfieldのみ) | title__regex=open |
keyword=<語 語...> | タイトルのキーワード検索 (tournament / league)。8語まで、1語100文字まで | keyword=summer%20cup |
owner=1 | 自分が管理者のものだけ (tournament / league)。Basic認証が必要 | owner=1 |
admin_id=<id> | 管理者で絞り込む (tournament / league)。Basic認証が必要で、自分のadmin_id以外は指定できない (admin_id=me は自分のadmin_id) | admin_id=twid:12345 |
player=<名前> | プレーヤー名の部分一致 (match)。2〜100文字。tdid の指定が必須 | tdid=XXXX&player=alice |
sort=<field> | 並べ替えのfield | sort=startTime |
order=asc|desc | 並び順 (既定は desc) | order=asc |
skip=<n> | 読み飛ばす件数 (100000まで) | skip=100 |
count=<n> | 取得件数 (上限あり。既定/上限は100) | count=50 |
fields=<field,...> | 返すfieldの選択 (公開fieldのみ指定可) | fields=tdid,title,status |
fields に指定できるのは各エンドポイントに記載のfieldだけです。
sort / fields に無いfieldを指定した場合、未知の __ 演算子、fieldの型に合わない値は result: -51 を返します。
記載に無いfieldでの絞り込みはエラーにならず無視されます (絞り込まれずに返るので、fieldの綴りを確認してください)。
時刻のfieldは createTime t_date startTime が秒、updateTime がミリ秒です。
同じfieldに複数の条件を付けられます (例: startTime__gte=...&startTime__lt=...)。
4. データ構造
APIが返すJSONはn01の内部データをそのまま反映しています。ここでは主なフィールドを説明します (記載の無いフィールドはシステム内部で使用しているものです)。更新APIも同じ構造で送ります。
4.1 IDの種類
| ID | 説明 |
|---|---|
tdid | トーナメントID。作成時に発行され、トーナメントのURLに含まれる (例: t_Ab1c_2345) |
lgid | リーグID (例: lg_Ab1c_2345)。リーグ配下のイベントはこのIDを持つ |
大会のページのURLはIDだけからは決まりません (単独のトーナメントとリーグ配下のイベントでは開くページが違います)。
tournament/get tournament/create league/get league/create は
文書と並べて参加者・観戦者が開くページの url を返すので、IDからURLを組み立てずにこれを使ってください。 | |
tpid | トーナメント用プレイヤーID。エントリー1件に対応する4文字のID |
lpid | リーグ用プレイヤーID |
tmid | トーナメント用マッチID。<tdid>_<Tタイプ>_<ラウンド>_<tpid>_<vsTpid> の形式
(リーグは <tdid>_lg_<ディビジョン>_<ラウンド>_<tpid>_<vsTpid>)。1つの対戦カードを表す |
mid | マッチID。1セット分のゲームデータに対応する |
scid | セット制の対戦で、同じ試合の複数セットをまとめるID |
schid | スケジュールID。チーム戦などで1つの対戦カードに複数の試合があるとき、その1試合を表す |
oid | チームメンバーID (トーナメント内で一意)。古いデータでは数値のことがある |
opid | チームメンバーの識別番号 (主催者が付ける任意の番号) |
4.2 Tタイプ (ttype)
トーナメントは複数の試合形式を同時に持つことができ、形式ごとに設定・対戦表・結果を持ちます。
形式はTタイプで表し、フィールド名の {Tタイプ}_ の部分になります。
| Tタイプ | 説明 |
|---|---|
lg | リーグ |
rr | ラウンドロビン |
t | シングルイリミネーション1 |
t3 | シングルイリミネーション1の3位決定戦 |
s2 | シングルイリミネーション2 |
s2_3 | シングルイリミネーション2の3位決定戦 |
dw | ダブルイリミネーションのウィナーサイド |
dl | ダブルイリミネーションのルーザーサイド |
m | 単発のマッチ形式 (勝ち抜き戦) |
4.3 トーナメントの状態 (status)
| status | 説明 |
|---|---|
| 10 | 準備中 |
| 20 | エントリー受付中 |
| 25 | トーナメント作成中 |
| 30 | 開催中 |
| 40 | 終了 |
4.4 トーナメント (tournament)
/api/v1/tournament/get が返す文書の主なフィールドです。
| フィールド | 形式 | 説明 |
|---|---|---|
tdid | 文字列 | トーナメントID |
lgid | 文字列 | 所属するリーグID (単独開催の場合はフィールドなし) |
league | 数値 | 1: リーグ配下のイベントとして扱い、トーナメントの一覧 (トーナメントエリアの一覧ページ) に表示しない。リーグ配下で作成すると 1 になる。/api/v1/tournament/list の絞り込みには影響しない |
createTime | 数値 | 作成日時 (UNIX時間・秒) |
updateTime | 数値 | 更新日時 (UNIX時間・ミリ秒) |
status | 数値 | トーナメントの状態 (4.3) |
title | 文字列 | トーナメントのタイトル |
t_date | 数値 | 開催日 (UNIX時間・秒)。未設定は0 |
s_date | 数値 | 並べ替え用の日付 (UNIX時間・秒)。作成時に t_date (未設定なら作成日時) から設定される。t_date を更新しても自動では変わらないので、開催日を変えるときは同時に指定する |
details | 文字列 | 開催要項 |
image | 文字列 | タイトル画像のURL |
color | 文字列 | 背景色 (標準テーマのときのみ使用) |
theme theme_css | 文字列 | 大会のテーマと、カスタムテーマのCSSのURL |
lang | 文字列 | 表示言語 ("" はブラウザの言語に従う) |
kind | 文字列 | 競技の種類 (darts softdarts billiards tennis table_tennis football common または任意の名称) |
softdarts | 数値 | 1: ソフトダーツ |
game_type | 数値 | 参加方法のビット和。1: n01 Live (対面) / 2: n01オンライン / 4: 結果の登録 |
private | 数値 | 1: 一覧に表示しない |
ad | 数値 | 1: 広告を表示する |
chat | 数値 | 1: チャットを有効にする |
show_avg | 数値 | 1: 平均を表示する |
dynamic_avg | 数値 | 1: ダイナミックアベレージを表示する |
auto_complete | 数値 | 1: トーナメントを自動で終了する |
confirm_start | 数値 | 1: 試合前に対戦相手の確認を求める |
select_first | 数値 | 1: 開始時に先攻プレイヤーを選択する (n01 Liveのみ) |
lf | 数値 | 1: 負け先 (前のLegを負けた方が次のLegの先攻) |
win_lose | 数値 | 1: 勝敗を○×で表示する (1ポイント先取のときのみ) |
sd_legs | 数値 | 1: ラベルの Sets を Legs にする |
individual_pass | 数値 | 1: 初回参加時に個別パスワードの設定を求める |
hide_sns | 数値 | 1: SNSエントリーを使用しない |
common_join | 数値 | 1: 参加時にプレイヤーを選択しない (全員のスコア入力が可能) |
show_entry_no | 数値 | 1: エントリーリストに番号を表示する |
team_games | 数値 | 1: チーム戦 |
name_sep | 文字列 | 名前の区切り文字 (ダブルス等で改行する文字) |
oom | 連想配列 | ランキング (OOM) の設定 |
entry_list | 配列 | エントリーリスト (4.6)。tournament/get のみ付加される |
{Tタイプ}_setting | 連想配列 | 形式ごとの設定 (4.5) |
{Tタイプ}_table | 配列 | 組合せ (4.5) |
{Tタイプ}_result | 配列 | 試合結果 (4.5) |
{Tタイプ}_title | 配列 | ラウンドのタイトル |
{Tタイプ}_init | 配列 | ガイド (組合せの初期表示) |
admin_id admin_namejoin_pass scorer_pass | 文字列 | 管理者IDと主催者名、参加パスワードとスコアラー用パスワード。自分が管理者の大会をBasic認証付きで取得したときだけ返る (5. 認証) |
4.5 対戦表と結果
組合せと結果は形式ごとに別のフィールドに入ります。{Tタイプ}_setting の有効フラグ
(lg_setting.league / rr_setting.round_robin /
t_setting.tournament / m_setting.matchs など) が1の形式だけが使われます。
| フィールド | 構造 |
|---|---|
t_table s2_tabledw_table dl_table |
ラウンドごとの配列で、各要素は tpid の配列。1回戦が [0]、2回戦が [1]。
まだ決まっていない枠は空文字 |
rr_table | グループごとの配列で、各要素はそのグループの tpid の配列 |
lg_table | ディビジョンごとの配列で、各要素はそのディビジョンの tpid の配列。
不戦勝 (bye) の相手は "empty" で表す |
t_result s2_resultdw_result dl_result
rr_result |
ラウンド (ラウンドロビンはグループ) ごとの配列。各要素は tpid をキーにした連想配列で、
その中は対戦相手の tpid をキーにした結果 |
lg_result | "<ディビジョン>_<lsid>" (例 "0_ab3f"。lsid は対戦カードの4文字のID) をキーにした連想配列。
その中の構造は他の形式と同じ |
rr_rank lg_rank | 手動で指定した順位 |
結果 ({Tタイプ}_result[ラウンド][tpid][vsTpid]) は次の形式です。
| フィールド | 説明 |
|---|---|
r | 試合結果。Leg制の試合ではLeg数、Set制の試合ではSet数 |
l | Leg数 (Set制の対戦のみ) |
a | 平均 |
t | 100+ |
t4 | 140+ |
t8 | 180's |
h | High Out |
b | Best Leg |
a_b | Second Legs |
w_b | Break Legs |
/api/v1/league/schedule/get / update / generate で読み書きします。
スイス式の設定は lg_setting.swiss / swiss_rounds / swiss_bh です。
4.6 エントリー
/api/v1/tournament/entry/list と tournament/get の entry_list の形式です。
| フィールド | 形式 | 説明 |
|---|---|---|
tpid | 文字列 | トーナメント用プレイヤーID |
name | 文字列 | プレイヤー名 (チーム戦ではチーム名) |
c | 文字列 | 国コード |
index | 数値 | 並び順 |
join | 数値 | 参加状態 (0〜9。1 = 参加済)。0 か未設定のときはフィールドなし |
startScore | 数値 | ハンデ (開始スコア)。未設定の場合はフィールドなし |
sns_type | 文字列 | リンクしているSNSの種類 (t: Twitter / f: Facebook / g: Google)。リンクしていない場合はフィールドなし |
4.7 リーグ (league)
リーグは複数のトーナメント (イベント) をまとめる入れ物です。配下のイベントは
/api/v1/league/tournament/list で取得します。
| フィールド | 形式 | 説明 |
|---|---|---|
lgid | 文字列 | リーグID |
title details | 文字列 | タイトルと説明 |
show_details | 数値 | 1: ポータルに説明を表示する |
createTime updateTime | 数値 | 作成日時 (秒) と更新日時 (ミリ秒) |
image colortheme theme_css lang | 文字列 | トーナメントと同じ。theme と lang は新規イベント作成時の初期値にもなる |
sort sort_order | 文字列 / 数値 | イベントの並べ替え (date / name / manual) と昇順 (1) / 降順 (-1) |
private ad | 数値 | トーナメントと同じ |
show_count | 数値 | ポータルとリーグ設定のイベント一覧に1ページで表示するイベント数 (無いか 0 なら 10) |
リーグのエントリー (/api/v1/league/entry/list) は lpid name c sns_type を持ちます。
4.8 マッチ (match)
マッチは1セット分のゲームデータです。進行中のマッチは match、
終了したものを含む全マッチは match_archive に入っており、
/api/v1/match/get はアーカイブを優先し、無い場合は進行中のマッチから返します
(live パラメータは /api/v1/match/list 専用です)。
| フィールド | 形式 | 説明 |
|---|---|---|
mid | 文字列 | マッチID |
match_type | 文字列 | "01" か "cricket"。フィールドが無いマッチは 01 |
tdid lgid | 文字列 | トーナメントID、リーグID |
tmid ttype round t_no | 文字列 / 数値 | 対戦カードのID、Tタイプ、ラウンド (0始まり)、トーナメント上の位置 (1始まり) |
scid schid | 文字列 | セットをまとめるIDと、スケジュール内の試合を表すID |
title orgTitle | 文字列 | サブタイトルを含むタイトルと、含まないタイトル |
startTime | 数値 | 開始時間 (UNIX時間・秒) |
updateTime | 数値 | 更新時間 (UNIX時間・ミリ秒) |
startScore | 数値 | 開始スコア (01のみ) |
roundLimit maxRound | 数値 | 0/1: ラウンド制限の有無と、制限するラウンド数 |
limitSet limitLeg | 数値 | 制限するSet数とLeg数 |
currentSet currentLeg | 数値 | 現在のSet / Legの位置 (0始まり) |
drawMode | 数値 | 0: 引き分けなし / 1: 引き分けあり |
endMatch | 数値 | 0: このセットは未終了 / 1: 終了済 |
endSchedule | 数値 | 全試合が終了すると1。終了していない場合はフィールドなし |
private | 数値 | 1: 履歴の一覧に表示しない |
legData | 配列 | Legごとのデータ |
statsData | 配列 | プレイヤーごとのスタッツ (左のプレイヤーが [0]) |
legData の各要素 (01の場合) は次の形式です。
| フィールド | 形式 | 説明 |
|---|---|---|
time | 数値 | Legの開始時間 (ミリ秒) |
first | 数値 | 0: 左のプレイヤーが先攻 / 1: 右のプレイヤーが先攻 |
endFlag | 数値 | 0: Leg未終了 / 1: 終了済 |
winner | 数値 | 0: 左のプレイヤーが勝者 / 1: 右のプレイヤーが勝者 |
middleForDiddle | 数値 | 1: ミドルフォーディドル (ブルの近さ) で勝敗を決めて終了したレッグ (勝者は winner)。投擲では決着していないため、集計ではこのレッグのダーツ数・得点は数えない。ラウンド制限に達したときに使われるが、それ以外でも使える |
playerData | 配列 | プレイヤーごとの配列で、その中はラウンドごとの
{"score": 獲得点数, "left": 残り点数}。
フィニッシュした場合の score は本数を表すマイナス値 (-1: 1本目 / -2: 2本目 / -3: 3本目) |
"playerData": [
[ {"score":0,"left":501}, {"score":180,"left":321}, {"score":180,"left":141}, {"score":-3,"left":0} ],
[ {"score":0,"left":501}, {"score":100,"left":401} ]
]
statsData の各要素は次の形式です。
| フィールド | 形式 | 説明 |
|---|---|---|
name | 文字列 | プレイヤー名 |
pid | 文字列 | プレイヤーID (n01内部のID) |
tpid | 文字列 | トーナメント用プレイヤーID |
winSets winLegs | 数値 | 勝ちSet数 (このセット開始時点) と勝ちLeg数 |
allScore allDarts | 数値 | 獲得スコアと投げたダーツ数 (平均の算出用) |
order | 配列 | チーム戦のオーダー (4.9) |
tid fid gid) は、設定されているかどうかを表す
"1" にマスクして返します。更新APIで statsData を送っても、
これらの項目はサーバ側の値がそのまま保持されます。
Cricket (match_type が "cricket") の場合、legData は
playerData の代わりに turns (1ターンずつの配列) を持ちます。
各ターンは {"p": プレイヤー, "r": ラウンド, "h": [[番号のindex, マーク数], ...]} で、
番号のindexは [20, 19, 18, 17, 16, 15, BULL] の位置です。
statsData は allScore の代わりに allMarks (総マーク数) を持ちます。
4.9 チームのメンバーとオーダー
チーム戦 (team_games が1) では、エントリー (tpid) がチームを表し、
その中のメンバーと、対戦ごとの出場順 (オーダー) を別に持ちます。
| フィールド | 説明 |
|---|---|
tpid | チーム (エントリー) のID |
oid | メンバーID。トーナメント内で一意 |
opid | メンバーの識別番号 (主催者が付ける任意の番号) |
oname | メンバー名 |
index | 並び順 |
オーダー (/api/v1/team/order/list) は (tmid, tpid, schid) ごとに1件で、
order にそのスケジュールに出場するメンバーが順番に入ります
(取得時は oid opid oname を補完して返します。
メンバーが見つからない場合は空文字)。
fix はオーダーが確定済みかどうか (1: 確定)、res はその試合の結果です。
4.10 ダブルスの作り方
ダブルスは次の2通りで作れます。通常は1つ目 (1つのエントリーに2人の名前を書く) で十分です。 プレイヤーごとのスタッツ (平均・ハイオフなど) を見たい場合は、2つ目のスケジュールでチームを組む方法が有効です。
| 方法 | エントリー | スタッツ |
|---|---|---|
| 1つのエントリーに2人の名前 (通常) | 1組 = 1エントリー。名前を 佐藤 / 鈴木 のように書き、
name_sep を "/" にすると区切りの後で改行して表示します | 組単位 |
| スケジュールでチームを組み、オーダーを自動設定する | 1組 = 1チーム。2人をチームのメンバーとして登録します | 組単位とプレイヤー単位 |
2つ目の方法の設定:
- トーナメントの
team_gamesを 1 にします (チーム戦)。 - 形式の設定 (
{Tタイプ}_setting) をlimit3 (スケジュール) にし、scheduleにnum_part2 のゲームを1つだけ置き、setOrder1 (オーダーを使う) とautoOrder1 (オーダーを自動設定する) を入れます。autoOrderはsetOrderが 1 のときだけ有効です。 - エントリー (チーム) ごとに2人を
/api/v1/team/player/updateで登録します。index(1, 2) がそのまま投げる順番の初期値になります (無ければ登録順)。 エントリー名は1つ目の方法と同じく佐藤 / 鈴木のようにしておくと対戦表で分かりやすくなります。
{
"team_games": 1,
"name_sep": "/",
"t_setting": {
"tournament": 1, "t_player_count": 16,
"limit": 3, "setOrder": 1, "autoOrder": 1, "exitResult": 1,
"schedule": [
{"subTitle": "Doubles", "startScore": 501, "match_type": "01", "roundLimit": 1, "maxRound": 15, "overkill": 0,
"limit_leg_count": 2, "drawMode": 0, "num_part": 2, "group": 0, "pt": 0, "ignore_avg": 0}
]
}
}
(t_setting のその他の項目は省略しています。{Tタイプ}_setting は丸ごと置き換わるので、実際には必要な項目をすべて入れてください。)
- オーダーの登録は不要です。 ゲームの開始時に、オーダーが未設定ならサーバがチームのメンバーの並び順 (
index) の上から2人を入れます。 参加者がオーダーを出す画面も出ません。/api/v1/team/order/updateで登録したオーダーがあればそちらを使います。 - 投げる順番は n01 Live のゲーム画面で変更できます。 各Legの開始前にヘッダーのチーム名 (プレイヤー名) を押すと、そのLegの投げる順番を入れ替えられ、 次のLegにも引き継がれます。n01 Live のヘッダーにはチーム名の代わりに2人の名前が並び、次に投げる人が強調されます。 オンライン対戦 (n01 Online) のゲーム画面には入れ替えの操作はありません。
- プレイヤーごとのスタッツは
/api/v1/tournament/statsのkind=player_stats_listで取得できます。 - ゲームが1つのスケジュールの対戦は、対戦表・順位表ではゲーム数 (1-0) ではなくLeg数 (2-1 など) で表示・集計されます。
5. 認証
HTTPのBasic認証を使います。ユーザーとパスワードはAPIのサブスクリプションを登録すると自動で発行されます (APIのサブスクリプションの登録)。
Authorization: Basic <user:pass をBase64エンコードした文字列>
認証に失敗した場合はHTTP 401と result: -40 を返します。
APIユーザーにはadmin_id (n01の管理者ID) が設定されています。作成・更新・削除ができるのは、
その管理者IDで管理しているトーナメント・リーグとその配下のデータだけです。権限が無い場合は
HTTP 403と result: -41 を返します。
Basic認証を使うAPI (データの作成・更新・削除と、認証を付けた取得) の利用には
APIのサブスクリプションが必要です。サブスクリプションが無い場合や有効期限が切れている場合は
HTTP 402と result: -42 を返します。認証を付けない取得API (公開されている範囲) は
サブスクリプション無しで利用できます (パスワードの変更 /api/v1/user/password もサブスクリプション不要です)。
APIユーザーの admin_id とできることの対応:
| admin_id | できること |
|---|---|
| 設定あり | そのIDが管理者のトーナメント・リーグの取得 (管理用の項目を含む)・作成・更新・削除 (サブスクリプションが必要) |
| 未設定 | 取得APIのみ (公開されている範囲) |
APIのサブスクリプションの登録
サブスクリプションはトーナメントの支払い画面から登録します。
- トーナメントの管理画面 (設定) を開きます。
- 「トーナメント利用料について」のリンクから支払い画面へ進みます。
- 「API」タブを選び、月額プランまたは年額プランをPayPalで購入します。
リーグの管理画面 (「リーグ利用料について」→「API」タブ) からでも同じように登録できます。 どちらから登録しても、そのn01の管理者IDに対して1つのサブスクリプションになります (大会ごとの契約ではありません)。人数を増やすためのサブスクリプションやイベント毎の支払いとは別の契約で、 APIのプランは大会の人数上限を増やしません。
登録すると管理者ごとに1つのAPIユーザーが自動で発行され、同じ「API」タブにユーザー名と有効期限が表示されます。 パスワードは発行した直後に1度だけ表示されるので控えておいてください。紛失した場合は同じ画面の 「パスワードの再発行」から再発行できます (再発行すると以前のパスワードは使えなくなります)。
キャンセルは支払い画面の「サブスクリプション一覧ページ」から行います。 キャンセルしても有効期限までは利用でき、有効期限が過ぎた時点で利用できなくなります。
OAuth 2.1 (MCPクライアント向け)
claude.ai のカスタムコネクタのように OAuth か認証なししか選べない MCP クライアントのために、
APIサーバは OAuth 2.1 の認可サーバも兼ねています。クライアントの登録から認可・トークン発行まで
標準の流れ (動的クライアント登録・認可コード + PKCE・リフレッシュトークン) に対応しているので、
MCP クライアントは https://push.n01darts.com/api/v1/mcp を登録するだけで自動的に見つけます。
- 認可の途中で n01 のログイン画面が開き、大会の管理に使っている Google / Facebook / X の アカウントでログインして許可すると、その管理者としてAPIを利用できます (発行される権限は同じ管理者のAPIユーザーと同じです)。
- 許可した時点でその管理者のAPIユーザーが無ければ自動で発行されます。
サブスクリプションは Basic認証と同じ扱いで、無い場合は認証を付けた呼び出し (取得も含む) が
result: -42になります (同意画面にサブスクリプションの有無と登録先を表示します)。 - 発行されたアクセストークンは
Authorization: Bearer <token>で REST API にもそのまま使えます。 有効期限は24時間で、リフレッシュトークン (90日) で更新します。無効なトークンには HTTP 401 とWWW-Authenticate: Bearerを返します。
| エンドポイント | 内容 |
|---|---|
GET /.well-known/oauth-authorization-server | 認可サーバのメタデータ (RFC 8414) |
GET /.well-known/oauth-protected-resource/api/v1/mcp | 保護リソースのメタデータ (RFC 9728) |
POST /api/v1/oauth/register | クライアントの登録 (RFC 7591)。redirect_uris は https (localhost のみ http 可) |
GET /api/v1/oauth/authorize | 認可 (response_type=code、PKCE の S256 が必須) |
POST /api/v1/oauth/token | トークンの発行 (authorization_code / refresh_token) |
POST /api/v1/oauth/revoke | トークンの失効 (RFC 7009) |
POST/api/v1/user/password
自分のパスワードを変更します。現在のパスワードでBasic認証したうえで、現在のパスワードと 新しいパスワードをJSONで送ります。新しいパスワードは8文字以上100文字以内で、 現在のパスワードと違うものにしてください。
{"password": "現在のパスワード", "new_password": "新しいパスワード"}
入力用の画面も用意しています:
パスワードの変更。新しいパスワードに制御文字は使えません (result: -3)。
6. データ作成・更新・削除API (Basic認証)
JSONボディをPOSTします (Content-Type: application/json)。
取得APIが返す公開フィールドは、ネストした構造 (対戦表・各種設定など) を含めてすべて更新できます。
非公開の項目・ID・削除フラグ・createTime / updateTime は更新できません。
更新できないフィールドや不正な値が1つでも含まれる場合、
リクエスト全体を result: -3 で拒否し、何も更新しません。
updateTime が自動的に更新されます。トーナメント系の更新は観戦画面などに
リアルタイム反映するための更新通知も送られます (トーナメントがリーグ配下の場合はリーグの
updateTime も更新されます)。
POST/api/v1/tournament/create
トーナメントを作成し、採番した tdid と、参加者・観戦者が開くページの url を返します。
共有するアドレスは url なので、利用者にはこれを案内してください。
set には /api/v1/tournament/update と同じフィールドを指定できます
(省略した項目は既定値になります)。entry_list でエントリーも同時に登録できます。
title (トーナメント名) と join_pass (参加パスワード) は必須で、
無い場合や空の場合は result: -3 で拒否します。作成時の title は前後の空白と制御文字を除き、
60文字を超える場合は先頭60文字 + ... に短縮して保存します (管理画面の作成と同じ。更新APIは200文字まで短縮なし)。
{
"set": {
"title": "Autumn Open",
"status": 20,
"t_date": 1800000000,
"join_pass": "pass1234",
"rr_setting": {"round_robin": 1, "robin_count": 1, "robin_player_count": 8}
},
"entry_list": [
{"name": "Player One", "c": "JP", "index": 1},
{"name": "Player Two", "c": "JP", "index": 2}
]
}
{"result":0, "tdid":"t_Ab1c_2345", "added":[{"tpid":"Xy3f", "name":"Player One"}, ...],
"url":"https://n01darts.com/n01/tournament/comp.php?id=t_Ab1c_2345"}
| 必須 | title join_pass |
|---|---|
| 主な既定値 | status=10 (準備中) kind=darts
ad=1 chat=1 show_avg=1 auto_complete=1
game_type=1 private=0 scorer_pass="" |
| サーバが設定する項目 | tdid admin_id admin_name
createTime updateTime s_date
pass_hash scorer_pass_hash max_user |
admin_name (画面に表示される主催者名) は、同じ管理者の直近のトーナメントかリーグから引き継ぎます。
無い場合はAPIのユーザー名になります。必要なら tournament/update で変更してください。
サイト運営者が支払い対象外にしている管理者のトーナメントは max_user 無し (人数上限なし) で、
広告なしにしている管理者のトーナメントは ad が 0 で作成されます (管理画面での作成と同じ)。
status 30 (開催中) で作成する場合は /api/v1/tournament/update の人数上限の確認を行い、
超えていれば作成したデータを取り消して result: -5 を返します (人数を確認できなかった場合は result: -6)。
有効な形式の対戦表が空のまま status 30 で作成することはできません (result: -3)。
形式の組み合わせの制限 (リーグ形式とラウンドロビン、ダブルイリミネーションとシングルイリミネーションは同時に有効にできない) と
3位決定戦の表の自動作成も /api/v1/tournament/update と同じです。
lgid を指定するとリーグ配下のイベントとして作成します (そのリーグの管理者である必要があります)。
管理者情報はリーグから引き継ぎ、league は1になります。
リーグ配下のイベントはリーグエリアのページで開くため、url は
https://n01darts.com/n01/league/season.php?id=<tdid> になります。
lg_setting / rr_setting / t_setting / s2_setting /
d_setting / m_setting は有効なものだけを保存し、対応する空の対戦表を作ります。
レスポンスには作成した文書の updateTime も入るので、続けて tournament/update するときの
expect_update_time にそのまま使えます (league/create も同じ)。
POST/api/v1/tournament/update
トーナメントを更新します。/api/v1/tournament/get が返す公開フィールドは
対戦表 (table) や各種設定を含めてすべて指定できます。
ただし tdid と entry_list は更新できません
(エントリーは /api/v1/tournament/entry/update で更新します)。
管理者の情報 (admin_id)、max_user や削除フラグ、サイト運営者だけが設定する項目
(ランキングや特殊な進行オプション) も更新できません。set が空の場合は result: -3 です。
広告の表示 (ad) は支払いの状態で決まるため、APIでは作成時も更新時も指定できません。
status を 30 (開催中) にする場合は管理画面と同じ人数上限の確認を行います。
トーナメントの参加人数 (主催者の他の開催中のトーナメントと合算) が無料の人数と購入済みの人数の合計を超えていると
result: -5 (HTTP 402) で拒否し、何も書き込みません (既に開催中のトーナメントと、人数上限の無い支払い対象外の
トーナメントでは確認しません。支払いサーバに問い合わせられなかった場合は result: -6)。
主催者は管理画面の料金ページから人数の購入かサブスクリプションの登録を行えます。他のステータスの変更には影響しません。
lgid を変更して別のリーグの配下に移す場合は、移動先のリーグの管理者である必要があります。
join_pass / scorer_pass を更新すると、参加時の照合に使う
pass_hash / scorer_pass_hash はサーバ側で計算し直します。
title と join_pass は必須項目のため、空にする更新は result: -3 で拒否します。
このAPIで更新すると、そのトーナメントを開いている管理画面は別の画面から保存したときと同じく無効になり、
次の保存は「データが更新されています」で失敗して再読み込みが必要になります。
逆に、取得してから更新するまでの間に管理画面 (や他のAPIクライアント) が行った変更を上書きしないためには、
/api/v1/tournament/get が返した updateTime (ミリ秒) を
expect_update_time に指定してください。その後にトーナメントが更新されていた場合は
result: -7 (HTTP 409) で拒否し、何も書き込みません。取得し直してから再度更新してください
(expect_update_time が整数でない場合は result: -51)。
{
"tdid": "トーナメントID",
"expect_update_time": 1767225600000,
"set": {
"title": "Spring Open 2026",
"status": 30,
"theme": "dark"
}
}
以下のfieldは値を検証します。
| field | 値 |
|---|---|
title | 文字列 (200文字まで。空にはできない) |
details | 文字列 (10000文字まで) |
status | 10=準備中 / 20=エントリー受付中 / 25=作成中 / 30=開催中 / 40=終了 (それ以外の値は拒否)。
30 にする更新は、有効な形式の対戦表 (lg_table / rr_table / t_table / s2_table /
dw_table / m_table) が無いか空だと -3 で拒否する (管理画面の「対戦表が作成されていません」と同じ。
同じリクエストで対戦表を送れば通る)。既に 30 の大会は確認しない |
private | 0 / 1 (一覧に表示しない) |
entry_lock | 0 / 1 (エントリーのロック) |
order_empty_error | 0 / 1 |
color | 背景色。CSSの色の値 (#rrggbb、#rgb、white のような色名、rgb() / rgba() / hsl() / hsla()) のみ。50文字まで、"" で解除 |
image | 文字列 (画像URL。2000文字まで) |
theme | "" / dark / scifi / neon / orange / custom |
theme_css | カスタムテーマのCSSのURL (https:// か / で始まるもののみ) |
lang | 表示言語 (""=自動、ja en など /n01/lang/ にある言語コード) |
kind | 競技の種類 (30文字まで)。darts softdarts billiards など |
lgid | 所属するリーグのID (100文字まで) |
t_date s_date | 開催日 / 並べ替え用の日付 (整数。UNIX時刻の秒。未設定は0)。t_date を変えても s_date は自動では変わらない |
lg_setting.swiss swiss_bh swiss_rounds | スイス式の設定。swiss / swiss_bh は 0 / 1、swiss_rounds は 0〜1023 の整数 (他の設定の中身は検査しない) |
game_type | 整数 (0〜7のビット和)。1=n01 Live / 2=n01 Online / 4=結果の入力 |
league softdarts chat show_avg
auto_complete confirm_start dynamic_avg lf
individual_pass hide_sns common_join
show_entry_no team_games select_first
win_lose | 0 / 1 |
sd_legs | 整数 (0〜99) |
name_sep | 文字列 (10文字まで) |
admin_name | 主催者名 (200文字まで) |
join_pass scorer_pass | 参加パスワード / スコアラー用パスワード (100文字まで。join_pass は空にはできない) |
lg_setting rr_setting t_setting
s2_setting d_setting m_setting |
ブロックが有効 (league / round_robin / tournament / matchs が1) のときサイズを検証する:
robin_count (1以上) と robin_player_count (2以上) は積が1024まで、
t_player_count は2〜1024の2の冪 (d_setting は4以上)、
match_count は1〜512。
リーグ形式 (lg_setting.league) とラウンドロビン (rr_setting.round_robin)、
ダブルイリミネーション (d_setting.tournament) とシングルイリミネーション (t_setting.tournament /
s2_setting.tournament) は同時に有効にできない (管理画面と同じ排他。保存済みの設定と合わせて判定するので、
切り替えるときは無効にする方の設定も同じリクエストで送る)。
t_setting.t3 / s2_setting.t3 を 1 にして t3_table / s2_3_table が無いか空なら、
空の3位決定戦の表 ([["",""],[""]]) をサーバが作る。
schedule (と game_setting の各要素の schedule) の各行のゲームID schid は、
無いか空ならサーバが採番する (0-9a-z の4文字。既存の値はそのまま)。同じスケジュール内で重複しているか文字列でなければ -3 |
t_table t3_table s2_table s2_3_table
dw_table dl_table m_table rr_table lg_table |
配列であること |
t_result t3_result s2_result s2_3_result
dw_result dl_result m_result rr_result lg_result
rr_rank lg_rank |
オブジェクトか配列であること |
| その他のfield | キーに $ と . を含まないこと、JavaScriptの予約名 (__proto__、constructor など) でないこと、
ネストは64段まで。1つでも違反があればリクエスト全体を -3 で拒否する |
設定と対戦表を書くときの注意 (大会の進行に影響するもの)
管理画面が画面上で防いでいる矛盾のうち、APIでは検査されないものです。守らないと試合が始められない・終わらない・大会が完了しないといった形で進行に影響します。
{Tタイプ}_settingは丸ごと置き換わります。{"tournament":1,"t_player_count":16}だけを送ると、それまで入っていたlimit/limit_leg_count/limit_set_count/schedule/game_setting/drawModeなどが消えます。 Leg数の無い設定では試合が終わらず、limitが 3 (スケジュール) なのにscheduleが無いと結果の登録がサーバエラーになります。 取得APIで読んだ設定全体に変更を加えて送ってください。有効な形式の設定には少なくともlimit(0=制限なし / 1=Leg数 / 2=Set数 / 3=スケジュール) と、それに対応するlimit_leg_count/limit_set_countとlimit_set_leg_count/schedule(配列)、drawMode(0 / 1。Leg数が1のときは 0) を入れます。リーグ形式とラウンドロビンでは勝ち点point_w/point_d/point_l(勝ち / 引き分け / 負け) も必要です (無いと順位表の勝ち点が計算できません)。low_win(低スコア勝ち) はlimitが 0 のときだけ意味を持ちます。limit3 (スケジュール) のscheduleの各行はゲームの定義です。 各行はsubTitle(表示名)、startScore(01 の開始スコア。0 は選手が選ぶ)、match_type("01"か"cricket"。省略は 01)、limit_leg_count(そのゲームのLeg数)、drawMode、roundLimit/maxRound(ラウンド制限の有無と回数)、overkill、num_part(チーム戦でそのゲームに出る人数。1=シングルス / 2=ダブルス)、group/pt/ignore_avg(集計のグループ・勝ち点・平均から除外)、schid(ゲームID) を持ちます。schidはサーバが採番するので省略できますが、既存のゲームのschidは変えないでください (オーダーと試合データがこのIDに紐づいていて、変えると別のゲームになります)。取得APIで読んだ行をそのまま使うのが確実です。 チーム戦では形式の設定にsetOrder(1: オーダーを使う) とautoOrder(1: オーダーを自動設定する) も入れます (4.10 ダブルスの作り方)。- 結果は
/api/v1/tournament/result/updateで書きます。{Tタイプ}_resultをtournament/updateで直接書くことも拒否はされませんが、その場合は勝者の次のラウンドへの進出、 ダブルイリミネーションの敗者の移動、完了判定、バッジの更新のどれも行われません (画面に結果が出るだけで大会が進みません)。 直接書くのは、result/updateで扱えない修正 (誤って入った結果の削除など) に限ってください。 game_typeを 0 にしない。 参加方法のビット和 (1=n01 Live / 2=n01 Online / 4=結果の入力) が 0 だと、参加者の画面で試合を始める操作が何も動きません。 1〜7 のいずれかにしてください (管理画面でも 0 で保存できるため、既存の大会の値も確認してください)。- リーグ配下のイベントのエントリーには
lpid(リーグのエントリーID) を付けます。 リーグの集計 (順位・スタッツ) は各イベントのエントリーのlpidでリーグの選手を同定します。/api/v1/tournament/entry/updateで追加したエントリーにlpidが無いとそのイベントの成績はリーグ集計に含まれず、 別の選手のlpidを付けるとその選手に加算されます。/api/v1/league/entry/listのlpidを使ってください (大会そのものの進行には影響しません)。 game_setting(ラウンド別の上書き) のroundの値。 シングルイリミネーション: 1以上はその回戦、-1=決勝、-2=準決勝、-3=3位決定戦。 ダブルイリミネーション: 1以上は Winners のその回戦、-1=グランドファイナル (リセット)、-2=グランドファイナル、-3=Winners 決勝、-4=Winners 準決勝、 -5=Losers 決勝、-6=Losers 準決勝、-11 以下は Losers のその回戦 (-11=1回戦、-12=2回戦...)。 ラウンドロビン / リーグ形式: 0から始まるブロック (ディビジョン) の番号。間違ったラウンドに書くとそのLeg数が別の試合に適用されます。- 不戦勝 (bye) は次のラウンドに自分で書きます。
1回戦の片側だけに選手がいる枠は、管理画面では対戦表の画面を開いたときに自動で次のラウンドへ繰り上がりますが、APIで対戦表を書いたときは行われません。
t_table[1](2回戦) 以降の該当する枠にそのtpidを入れてください (両側が空の枠が続く場合はさらに上のラウンドまで)。 入れないと、管理者が対戦表の画面を開くまでその選手は2回戦に現れません。 - リーグ形式は対戦カードが無いと結果を受け付けません。
リーグ形式の対戦は
lg_table(ディビジョンごとの選手の並び) ではなく、別に保存される対戦カード (フィクスチャ。/api/v1/league/schedule/getが返すもの) の単位で行われます。lg_setting.leagueを 1 にしてlg_tableに選手を入れても、 対戦カードは作られません (管理画面では対戦表の画面を開いたときに自動で作られますが、APIでは行われません)。 開催中にする前に/api/v1/league/schedule/generate(またはupdate) で、選手を入れたディビジョンごとにカードを作ってください。statusを 30 にする更新は対戦表 (lg_table) の有無しか確認せず、カードが無くても拒否しません。 カードが無いディビジョンでは、参加者の画面にディビジョンと選手名だけが出て試合を始めるボタンが無く、結果の登録も拒否され、大会が完了しません。 その状態になったら、開催中のままカードを作れば (generateかupdate) 復旧します (データは壊れません)。/api/v1/league/schedule/getで、選手のいる全ディビジョンにカードがあることを確認してから 30 にするのが確実です。robin_countを変えたらカードのディビジョン数も合わせます (robin_countがカードのディビジョン数より多いとサーバエラーになります)。 スイス式の不戦勝の結果は、カードの保存時とstatusを 30 にしたときにサーバが記録します (管理画面と同じ)。 - エントリーを削除しても対戦表からは消えません。
/api/v1/tournament/entry/updateのremoveは{Tタイプ}_tableに残ったtpidを検査しません。 対戦表に存在しないtpidが入っていると、その枠は空欄で表示され、その試合は誰も始められません。表からも外してください。 rr_tableを差し替えたら関連するフィールドも合わせます。 管理画面はrr_tableとrr_seq(試合順。各ペアはtpidの昇順) /rr_order/rr_board/rr_disableを常に一括で保存します。rr_tableだけを変えると、これらが古い配置を指したまま試合順や進捗の集計が狂います。 使わないものはrr_tableの並びから作り直すか、表と一緒に空にしてください。assign_setting(決勝トーナメントへの割当) の人数は枠数以内にします。 ブロックから進出させる人数の合計が決勝トーナメントのt_player_countを超えても拒否されず、超えた分の選手は割当時に黙って落ちます。t_dateを変えたらs_dateも同じ値で送ります (一覧の並び順に使われる日付は自動では変わりません)。
形式が有効なら対戦表の形も管理画面が作るものと同じにしてください: t_table / s2_table は
log2(t_player_count) + 1 行で各行の長さが半分ずつ減る、dw_table は log2(t_player_count) + 3 行、
dl_table は 2 × (log2(t_player_count) − 1) 行、m_table は match_count 行の [左, 右]、
rr_table / lg_table は robin_count 行で各行 robin_player_count 個。
形が違うと勝者が次のラウンドに書かれない、Losers 側の選手が消える、大会が完了しないといった症状になります (APIは形を検査しません)。
lgid や private を変えると、管理画面のリーグへの紐付けと同じように、そのトーナメントのマッチ
(進行中・アーカイブ) の lgid / private も揃えて更新します。
POST/api/v1/tournament/delete
トーナメントを削除します (削除フラグを立てる論理削除で、リーグとの紐付けも解除します)。 削除後は取得APIから見えなくなります。
{"tdid": "トーナメントID"}
POST/api/v1/tournament/entry/update
トーナメントのエントリーを追加・更新・削除します。add / update / remove は任意で、必要なものだけ指定します
(3つとも空なら result: -51)。remove はエントリーを完全に削除します (チームメンバーの remove と違い
元には戻せません。直前の状態はバックアップに残ります)。
{
"tdid": "トーナメントID",
"add": [
{"name": "New Player", "c": "JP", "index": 10}
],
"update": [
{"tpid": "aaaa", "name": "Renamed Player", "join": 1}
],
"remove": ["bbbb"]
}
エントリーの公開フィールドはすべて指定できます (tdid tpid とSNS連携の識別情報は更新不可)。
以下のfieldは値を検証します。
| field | 値 |
|---|---|
name | 表示名 (前後の空白と制御文字は除去。60文字を超える場合は先頭60文字 + ... に短縮して保存。200文字を超える値は result: -3)。追加時は必須 |
c | 国コード (10文字まで) |
sname | 補助名 (100文字まで。取得APIでは返しません) |
join | 整数 (0〜9)。参加状態 |
index | 整数 (0〜100000)。並び順 |
startScore | 整数 (0〜100000)。ハンデ |
pass | 個別パスワード (文字列、100文字まで)。参加者が参加画面で入力するものと同じ規則 (前後の空白を除き小文字にして照合) で保存し、パスワードそのものは保存しません。"" で解除 (管理画面の「パスワードのクリア」と同じ) |
release_sns | 1 でそのエントリーのSNS連携を解除 (管理画面の「SNSの解除」と同じ。sns_id sns_type とSNS由来の sname を退避し、再連携できる) |
追加したエントリーには tpid が採番され、レスポンスの added に入ります。
update は tpid で対象を指定します。レスポンスの updated / removed
は実際に処理できた件数です。
{"result":0, "added":[{"tpid":"Xy3f", "name":"New Player"}], "updated":1, "removed":1}
POST/api/v1/league/create
リーグを作成し、採番した lgid と、リーグのポータルページの url を返します。
set には /api/v1/league/update と同じフィールドを指定でき、
entry_list でエントリーも同時に登録できます。
title (リーグ名) は必須で、無い場合や空の場合は result: -3 で拒否します。
{
"set": {"title": "Winter League", "details": "season 3"},
"entry_list": [{"name": "League Player", "c": "JP"}]
}
{"result":0, "lgid":"lg_Ab1c_2345", "added":[{"lpid":"Xy3f", "name":"League Player"}],
"url":"https://n01darts.com/n01/league/portal.php?lgid=lg_Ab1c_2345"}
| 必須 | title |
|---|---|
| 主な既定値 | ad=1 private=0
sort=date sort_order=-1 |
| サーバが設定する項目 | lgid admin_id admin_name
createTime updateTime |
admin_name は同じ管理者の直近のトーナメントかリーグから引き継ぎます。無い場合はAPIのユーザー名になります。
POST/api/v1/league/update
リーグを更新します。/api/v1/league/get が返す公開フィールドはすべて指定できます
(lgid entry_list createTime updateTime と管理者の情報 (admin_id)、
広告の表示 (ad)、サイト運営者だけが設定する項目は更新できません)。
title は必須項目のため、空にする更新は result: -3 で拒否します。
/api/v1/tournament/update と同じく、更新するとそのリーグを開いている管理画面は無効になります。
また expect_update_time (/api/v1/league/get が返した updateTime) を指定すると、
その後にリーグが更新されていた場合は result: -7 で拒否します。
{
"lgid": "リーグID",
"expect_update_time": 1767225600000,
"set": {"title": "Main League 2026"}
}
以下のfieldは値を検証します。
| field | 値 |
|---|---|
title | 文字列 (200文字まで。空にはできない) |
details | 文字列 (10000文字まで) |
show_details | 0 / 1 (ポータルに説明を表示する) |
image | 文字列 (画像URL。2000文字まで) |
color | 背景色。CSSの色の値 (トーナメントと同じ) |
private | 0 / 1 (一覧に表示しない) |
show_count | 整数 (0〜10000。1ページに表示するイベント数、0 は既定の 10) |
status | 整数 (0〜99) |
theme | "" / dark / scifi / neon / orange / custom |
theme_css | カスタムテーマのCSSのURL (https:// か / で始まるもののみ) |
lang | 新規イベントの表示言語の初期値 (""=自動) |
sort | イベントの並べ替え (date / name / manual) |
sort_order | 1 (昇順) / -1 (降順) |
admin_name | 主催者名 (200文字まで) |
join_pass scorer_pass | 参加パスワード / スコアラー用パスワード (100文字まで) |
POST/api/v1/league/entry/update
リーグのエントリーを追加・更新・削除します。add / update / remove は任意で、
必要なものだけ指定します。使い方はトーナメントのエントリー更新と同じで、
対象の指定に lpid を使います。
{
"lgid": "リーグID",
"add": [{"name": "New Player", "c": "JP"}],
"update": [{"lpid": "aaaa", "name": "Renamed Player"}],
"remove": ["bbbb"]
}
エントリーの公開フィールドはすべて指定できます (lgid lpid とSNS連携の識別情報は更新不可)。
値を検証するfieldは name (追加時は必須) c sname index です。
{"result":0, "added":[{"lpid":"Xy3f", "name":"New Player"}], "updated":1, "removed":1}
POST/api/v1/league/delete
リーグを削除します (論理削除)。配下にイベント (トーナメント) が残っている場合は
result: -3 で拒否します。先にイベントを削除するか、リーグから外してください。
{"lgid": "リーグID"}
POST/api/v1/match/create
終了した試合の試合データ (1 投ごとのスコア) を作成します。n01 以外でスコアリングした試合や、
古い記録の取り込みに使います。作成した試合はアーカイブ (履歴・集計の対象) に保存され、
/api/v1/match/get / /api/v1/match/list で取得できます。
作成できるのは、そのトーナメント (tdid) の管理者だけです。
set には /api/v1/match/get が返すフィールドを指定します。
statsData (2 人。それぞれにエントリーの tpid が必須) と
legData (Leg の配列。構造は取得 API と同じ) は必須で、
ttype / round / t_no (対戦表の位置。tmid は省略すると
ttype / round / 両者の tpid から組み立てます)、
startTime (UNIX 秒。省略時は現在時刻)、match_type (01 / cricket)、
startScore、limitLeg / limitSet、
scid / currentSet (Set 制では 1 Set = 1 試合データで、同じ scid でまとめます)、
title は任意です。
statsData の name はエントリー名、winLegs / allScore / allDarts は
01 なら legData から計算した値が省略時に入ります (SNS 連携の項目は空になります)。
{
"tdid": "トーナメントID",
"set": {
"ttype": "rr", "round": 0, "startTime": 1105335600,
"startScore": 501, "limitLeg": 2,
"statsData": [{"tpid": "aaaa"}, {"tpid": "bbbb"}],
"legData": [
{"first": 0, "winner": 1, "currentRound": 5, "currentPlayer": 1, "endFlag": 1,
"playerData": [
[{"score": 0, "left": 501}, {"score": 100, "left": 401}, {"score": 60, "left": 341}, {"score": 85, "left": 256}, {"score": 100, "left": 156}, {"score": 60, "left": 96}],
[{"score": 0, "left": 501}, {"score": 140, "left": 361}, {"score": 100, "left": 261}, {"score": 81, "left": 180}, {"score": 140, "left": 40}, {"score": 60, "left": -20}, {"score": -2, "left": 0}]
]}
]
}
}
{"result":0, "mid":"Ab3kR9xz_1700000000000", "tmid":"t_xxxx_rr_0_aaaa_bbbb", "startTime":1105335600, "updateTime":1700000000000}
*_result) は書きません。試合データと合わせて勝敗を入れるときは
/api/v1/tournament/result/update を使ってください。
作成するとトーナメントの updateTime を更新して更新通知を送ります (集計画面のキャッシュが作り直されます)。
mid、削除フラグ、内部の項目、tdid / lgid は set に指定できません (result: -3)。
POST/api/v1/match/update
マッチを更新します。アーカイブを基本に更新し、進行中のマッチが存在する場合は
同期を保つため両方を同時に更新します。
/api/v1/match/get が返す公開フィールドは statsData を含めてすべて指定できます
(mid、削除フラグ、内部の項目と、マッチが属するトーナメント・対戦表の識別
(tdid lgid tmid schid scid ttype round gs_round) は更新不可)。
更新できるのは、そのマッチが属するトーナメント (tdid) の管理者だけです
(tdid を持たないマッチは更新できません)。
statsData を更新しても、取得APIでマスクされる項目はサーバ側の値がそのまま保持されます。
{
"mid": "マッチID",
"set": {"title": "Grand Final", "private": 1}
}
以下のfieldは値を検証します。
| field | 値 |
|---|---|
title | 文字列 (200文字まで) |
private | 0 / 1 (履歴の一覧に表示しない) |
updateTime も更新し更新通知を送ります
(集計画面のキャッシュが作り直されます)。
POST/api/v1/match/delete
マッチを削除します (削除フラグを立てる論理削除です)。アーカイブと進行中の両方に存在する場合は
両方にフラグを立てます。更新と同じく、そのマッチが属するトーナメント (tdid) の
管理者だけが実行できます (tdid を持たないマッチは削除できません)。
{"mid": "マッチID"}
updateTime を更新して更新通知を送りますが、
対戦表の結果 (*_result) やチームのオーダーの結果は再計算しません。
必要な場合は /api/v1/tournament/update で対戦表を更新してください。
POST/api/v1/team/player/update
チーム (tpid) のメンバーを追加・更新・削除します。
add / update / remove は任意で、必要なものだけ指定します。
{
"tdid": "トーナメントID",
"add": [{"tpid": "aaaa", "oname": "Team Member", "opid": "P-01", "index": 1}],
"update": [{"tpid": "aaaa", "oid": "Xy3f", "oname": "Renamed Member"}],
"remove": [{"tpid": "aaaa", "oid": "Ab1c"}]
}
以下のfieldは値を検証します。
| field | 値 |
|---|---|
oname | 選手名 (制御文字は除去。60文字まで。超えるとリクエスト全体を result: -3 で拒否)。追加時は必須 |
opid | 選手の識別番号など (20文字まで) |
index | 整数。並び順 |
delete | 0 / 1 (削除状態) |
add は tpid と oname、update / remove は tpid と oid が必須です
(無いと result: -3。3つとも空なら result: -51)。
追加したメンバーには oid が採番され、レスポンスの added に入ります
(lgid はトーナメントから引き継ぎます)。update と remove は
tpid と oid で対象を指定します。
{"result":0, "added":[{"tpid":"aaaa", "oid":"Xy3f", "oname":"Team Member"}], "updated":1, "removed":1}
remove は物理削除ではなく削除フラグを立てます (オーダーに残っている選手名は
そのまま表示されます)。update で "delete": 0 を送ると元に戻せます。
削除済みのメンバーは /api/v1/team/player/list?...&all=1 (そのトーナメントの管理者のみ) で確認できます。
POST/api/v1/team/order/update
チームのオーダーを登録・更新・削除します。update は
(tmid, tpid, schid) の組で登録し、
まだ無い場合は追加します (追加した件数は added に入ります)。
{
"tdid": "トーナメントID",
"update": [
{"tmid": "...", "tpid": "aaaa", "schid": "...", "order": [{"oid": "Xy3f"}, {"oid": "Ab1c"}]}
],
"remove": [{"tmid": "...", "tpid": "aaaa", "schid": "..."}]
}
{"result":0, "added":1, "updated":0, "removed":1}
| field | 値 |
|---|---|
order | オーダーの配列 (200件まで)。各要素は oid と、任意で modify (0 / 1) |
statsData のオーダーにも選手名を補完して反映し、
オーダー画面向けの更新通知を送ります。remove はオーダーを削除し、マッチ側のオーダーを空にします。
オーダーの結果 (res) は更新できません (対戦表の再計算を伴うため、結果は
/api/v1/tournament/update で更新してください)。
POST/api/v1/tournament/result/update
対戦表の1試合の結果を、管理画面の結果入力と同じ処理で登録 (または取り消し) します。
サーバが <ttype>_result の両側を書き、勝者を次のラウンドへ進め (ダブルイリミネーションの敗者は Losers へ)、
3位決定戦の枠を埋め、auto_complete が有効なら全試合終了時にトーナメントを終了 (status 40) にします。
/api/v1/tournament/update で *_result を直接書く場合はこれらの進行処理が行われないため、
結果の入力にはこちらを使ってください。
{
"tdid": "トーナメントID",
"ttype": "t",
"round": 0,
"t_no": 1,
"tpid": "aaaa",
"vsTpid": "bbbb",
"result": 3,
"vsResult": 1,
"detail": {"a": 65.2, "t": 4, "t4": 1, "t8": 0, "h": 80, "b": 15},
"vsDetail": {"a": 58.0}
}
| field | 値 |
|---|---|
ttype | t t3 s2 s2_3 rr lg dw dl m |
round | ラウンドの添字 (1回戦 = 0)。rr はブロックの添字、m は試合の添字、lg は "<ディビジョン>_<lsid>" の文字列 |
t_no | ラウンド内の試合番号 (1始まり)。t t3 s2 s2_3 dw dl で使い、それ以外は 0 |
tpid vsTpid | 対戦する2人 (チーム)。通常のリーグの不戦勝は vsTpid を "empty" にする |
result vsResult | それぞれが取った Leg 数 (セット制はセット数、チーム戦は勝ったゲーム数)。両方を null にすると結果を取り消す |
detail vsDetail | 任意。スタッツ (a 平均、t 100+、t4 140+、t7 170+、t8 180、h ハイアウト、b ベストレッグ、a_b / w_b 後攻のレグ数と勝数、mk Cricket のマーク分布、add 加点、g チーム戦のゲームごとのレグ数、l セット制のレグ数)。これ以外のキーや数値・数値配列でない値は result: -51 |
tpid と vsTpid は異なる値で、result と vsResult は両方とも数値か両方とも null にします。
パラメータの誤り (ttype round t_no など) は result: -51、管理画面側の処理が受け付けなかった場合は result: -3 です。
result: -62 を返します。
POST/api/v1/league/schedule/update
リーグ形式の1ディビジョンの対戦カード (フィクスチャ) を丸ごと置き換えます。管理画面の対戦カードの保存と同じ処理で、
スイス式の不戦勝 (p が [tpid, "empty"]) の結果はサーバが記録します。
{
"tdid": "トーナメントID",
"div": 0,
"schedule": [
{"p": ["aaaa", "bbbb"], "lsid": "ab3f", "t": ""},
{"p": ["cccc", "dddd"]}
],
"expect": 2
}
| field | 値 |
|---|---|
div | 必須。ディビジョンの添字 (0〜1024) |
schedule | ディビジョンの全カード (4096行まで)。各要素は p (必須。tpid 2つ。"" 未設定 / "empty" 不戦勝)、lsid (英小文字と数字の4文字。既存のカードは必ず同じ値を付け、重複は不可。lsid が変わると別のカードになり結果が参照されなくなる。省略すると新しく採番)、t (タイトル、100文字で切り詰め)、r (スイス式のラウンド番号、1〜1024) |
expect | 任意。土台にした現在のカード数。サーバ側の件数と違えば result: -7 で拒否し何も書きません (別の端末での変更との競合対策) |
レスポンスには採番した lsid を含む保存後の schedule と div が入ります。
update / generate ともリーグ形式 (lg_setting.league が 1) の大会でないと result: -51 です。
POST/api/v1/league/schedule/generate
lg_table (ディビジョンへの選手の割当) から対戦カードを生成して保存します。管理画面の自動組合せ・スイス式の
ボタンと同じ規則です。div を省略すると全ディビジョンを処理します。スイス式でない大会に swiss_*、
スイス式の大会に robin を指定した場合と、robin_count が未設定の場合は result: -51 です。
{"tdid": "トーナメントID", "div": 0, "mode": "auto"}
mode | 動作 |
|---|---|
robin | 総当たり (通常のリーグ)。全組合せ (turnaround なら往復) を作り、結果のあるカードは lsid ごと残す |
swiss_first | スイス式の1回戦の空枠 (⌈人数/2⌉ 行) を作る |
swiss_assign | 空枠に未配置の選手をランダムに入れる (人数が奇数なら1人が不戦勝) |
swiss_next | 次のラウンドを生成する (勝ち点グループ内で順位順に組み、再戦と流れの連続を避ける。再戦が避けられないときは rematch にその数) |
auto (既定) | 通常のリーグは robin。スイス式はラウンドが無ければ1回戦を作ってランダム配置、空枠があれば配置、無ければ次のラウンド |
{"result":0, "swiss":1, "divisions":[
{"div":0, "before":3, "action":"swiss_next", "round":2, "total":3, "blank":0, "rematch":0, "after":6, "schedule":[...]}
]}
処理しなかったディビジョンは skipped に理由が入ります (人数不足・全ラウンド生成済み・空枠が残っている など)。
保存はディビジョンごとに現在のカード数を expect にして行うので、同時に別の端末で変更されていれば result: -7 になります。
POST/api/v1/league/tournament/link
トーナメントをリーグ配下のイベントにします (管理画面の「シーズンの紐付け」と同じ)。lgid tdid が必須で、
両方の管理者である必要があります。トーナメントとそのマッチに lgid とリーグの private を設定します。
{"lgid": "リーグID", "tdid": "トーナメントID"}
POST/api/v1/league/tournament/unlink
イベントをリーグから外します (管理画面の「紐付けの解除」と同じ)。トーナメント・エントリー・チームのメンバー・マッチの
lgid を消します。lgid と tdid が必須で、両方の管理者である必要があります。
そのリーグ配下のイベントでない場合は result: -51 で拒否します。
{"lgid": "リーグID", "tdid": "トーナメントID"}
POST/api/v1/team/order/fix
チーム戦のオーダーを確定 (fix 1) または確定解除 (fix 0) します。管理画面のオーダー確定と同じで、
両チームが確定すると互いのオーダーが見えるようになります。
{"tdid": "トーナメントID", "tmid": "対戦カードID", "tpid": "aaaa", "vsTpid": "bbbb", "fix": 1}
POST/api/v1/team/order/result
チーム戦の1ゲーム (schid) の結果を手入力します (管理画面の対戦カードの結果入力と同じ)。
サーバがゲームごとの勝数を数えてカードの結果を <ttype>_result に書き、対戦表を進めます。
{
"tdid": "トーナメントID",
"tmid": "対戦カードID",
"schid": "a1b2",
"ttype": "t",
"round": 0,
"t_no": 1,
"tpid": "aaaa",
"vsTpid": "bbbb",
"p1res": {"r": 3, "a": 70.5},
"p2res": {"r": 1, "a": 61.0}
}
| field | 値 |
|---|---|
ttype round t_no | tournament/result/update と同じ |
gs_round | 任意。ラウンド別のゲーム設定を引くラウンド (既定は round、lg はディビジョン) |
p1res p2res | tpid / vsTpid の結果。r (取った Leg 数) が必須で、他は detail と同じスタッツ |
POST/api/v1/tournament/badge/update
試合のバッジ (台番号) を設定します (管理画面のバッジ管理と同じ)。1件をボディに直接、または list に複数を指定します。
参加者の画面には更新通知で即時に反映されます。
{"tdid": "トーナメントID", "ttype": "t", "round": 0, "index": 2, "str": "5", "st": 1}
{"tdid": "トーナメントID", "list": [{"ttype": "t", "round": 0, "index": 2, "str": ""}, {"ttype": "rr", "round": 1, "index": 0, "str": "A-3", "st": 2}]}
| field | 値 |
|---|---|
ttype | t t3 s2 s2_3 dw dl m rr lg |
round index | ラウンドの添字と枠の添字 (枠 2k と 2k+1 の試合は t_no k+1)。バッジのキーは "<ttype>-<round>-<index>" |
str | 台の表示 (40文字まで)。"" でバッジを消す |
st | 0 無し / 1 試合中 (str があるときの既定) / 2 終了 |
t_memo t_memo_tpid | 任意。同時に試合のメモ (審判など) を書く。既にメモがある試合には書かず、t_memo_tpid がその試合の出場者のときも書かない (審判の自動設定と同じ規則) |
list | 複数をまとめて送る (1〜200件) |
{"result":0, "updated":2}
POST/api/v1/tournament/memo/update
ラウンドロビンのブロック (ttype rr) またはリーグのディビジョン (lg) の下に表示するメモを設定します。
memo はブロック / ディビジョンごとの文字列の配列 (1024要素まで。各200文字を超える分は切り詰め) で、空の配列で消します。
{"tdid": "トーナメントID", "ttype": "rr", "memo": ["36番台", "37番台"]}
POST/api/v1/tournament/t_memo/update
対戦表の試合に表示するメモ (40文字まで。審判など) を設定します。key はバッジと同じ
"<ttype>-<round>-<index>" (試合の偶数側の枠) で、str を "" にすると消えます。
1件をボディに直接、または list に複数 (1〜200件) を指定します。レスポンスに updated (件数) が入ります。
{"tdid": "トーナメントID", "key": "t-0-2", "str": "Referee: Taro"}
POST/api/v1/tournament/announce/update
参加者に表示するアナウンス (200文字まで) を設定します。"" で消します。announceTime (ミリ秒) は省略すると現在時刻です (announce が "" のときは 0)。
レスポンスには保存した announce と announceTime が入ります。
{"tdid": "トーナメントID", "announce": "決勝は 18:00 開始です"}
POST/api/v1/tournament/assign/update
ラウンドロビン / リーグの上位を決勝トーナメントへ割り当てる設定 (assign_setting) を保存します。
管理画面の割当設定と同じ規則で値を整えて保存し、保存後の assign_setting を返します。
assign は保存済みの設定を丸ごと置き換えます (部分更新ではありません)。指定しなかった項目は既定値
(t_type=top / s2_type=low / count=2 / 各フラグ false /
referee_type=lowest) になり、範囲外の値はエラーにせず既定値に丸めます。現在の値は
tournament/get の assign_setting で確認できます。
{"tdid": "トーナメントID", "assign": {"t_type": "top", "t_count": 2, "t_complete": true, "s2_type": "low", "s2_count": 2}}
field (t_ / s2_ の接頭辞付き) | 値 |
|---|---|
type | top 上位 / low 下位 / custom グループの人数ごとに指定 |
count | グループから抜ける人数 (1〜99) |
placeholder complete referee | true / false。未定枠に順位のプレースホルダを表示 / 完了したグループだけ割り当てる / 審判を設定する |
referee_type | lowest / random |
custom | {"<人数>": {"type": "top", "count": 2}} |
POST/api/v1/tournament/copy
トーナメントをコピーします (管理画面のコピーと同じ。status 10、同じ設定・同じリーグ配下)。新しい tdid と url を返します。
{"tdid": "トーナメントID", "title": "Autumn Open 2027", "date": 0, "entry": 1, "result": 0}
| field | 値 |
|---|---|
title | 任意。コピーのタイトル (60文字まで。省略時は同じタイトル) |
date | 1 で開催日も写す (既定 0) |
entry | 1 でエントリーと対戦表も写す (既定 0。このときバッジ・試合順・試合メモも一緒に写る) |
result | 1 で結果も写す (entry 1 が必要。既定 0) |
guide | 1 でガイド (初期の対戦表 {ttype}_init) も写す (既定 0) |
{"result":0, "tdid":"t_Ab1c_2345", "url":"https://n01darts.com/n01/tournament/comp.php?id=t_Ab1c_2345"}
POST/api/v1/tournament/match/release
ゲームのロックを解除します (管理画面の試合メニューの「ゲームのロックを解除」と同じ)。
n01 Live で「別の場所でゲーム中のためロックされています」と出て試合を始められない対戦カード
(tmid。チーム戦は任意で schid) の両選手のゲーム中の状態を解除し、試合を始め直せるようにします。
マッチのデータや対戦表・結果には触れません。
{"tdid": "トーナメントID", "tmid": "対戦カードID"}
POST/api/v1/autopilot/update
自動進行の設定を更新します。config に指定した項目だけを保存済みの設定に上書きし (types はタイプごとにマージ)、
設定画面と同じ規則で値を整えて保存します。自動進行サーバには即時に通知されます。保存後の設定を返します。
{"tdid": "トーナメントID", "config": {"types": {"t": {"badge_number": "1-10,12", "break_time": 5, "round": 2.5, "enable": 1}}, "remove_old_badge": 1}}
| field | 値 |
|---|---|
types.<t|s2|dw|dl>.badge_number | 使う台の番号 ("1-10,12" のような指定。200文字まで) |
types.<t>.break_time | 試合後の休憩 (分、0〜1440) |
types.<t>.round | 対象ラウンド (0〜99、0.5刻み)。0 は全ラウンド / x は x 回戦まで / .5 を付けると3位決定戦も対象 (3位決定戦が対象になるのは x が決勝の1つ前のラウンドのとき。決勝は含まない) |
types.<t>.enable | 0 / 1。自動割当を動かす |
remove_old_badge set_referee | 0 / 1。終了した試合のバッジを消す / 審判を設定する |
referee_type | same_board / prev_upper / prev_lower / prev_random |
name_control name_mode name_sep name_stop name_regex priority hold_robin | 名前の抽出と優先度 (同じ人が複数のイベントに出るとき)。name_mode は auto / simple / regex、priority は -99〜99 |
7. resultコード一覧
| result | HTTP | 意味 |
|---|---|---|
| 0 | 200 | 成功 |
| -1 | 404 | 対象が見つからない (存在しない / 削除済み) |
| -3 | 400 | 更新フィールドが不正 (許可されていない / 値が不正) |
| -5 | 402 | トーナメントの参加人数が主催者の支払い済みの上限を超えているため、開催中 (status 30) にできない |
| -6 | 502 | 人数上限を確認できなかった (支払いサーバのエラー)。開催中にはしない |
| -7 | 409 | expect_update_time (対戦カードでは expect) より後に対象が更新されている。何も書き込まない |
| -40 | 401 | 認証エラー |
| -41 | 403 | 権限エラー (そのデータの管理者ではない / admin_idが未設定) |
| -42 | 402 | APIのサブスクリプションが無い / 有効期限切れ |
| -43 | 403 | 送信元のIPアドレスからのアクセスが拒否されている |
| -50 | 400 / 413 / 415 | リクエストボディが不正 (JSONとして解釈できない。1MBを超えると 413、Content-Type が application/json でないと 415) |
| -51 | 400 | パラメータが不正 |
| -52 | 404 | エンドポイントが存在しない |
| -53 | 405 | メソッドが不正 |
| -54 | 503 | 検索に時間がかかりすぎた (一覧APIは10秒で打ち切る)。絞り込みを狭めて再試行する |
| -55 | 429 | 短時間のアクセスが多すぎる (送信元IPごとの上限。目安は1分あたり300件)。Retry-After ヘッダの秒数を待ってから再試行する。MCPも同じHTTP 429で拒否される |
| -60 | 501 | 集計API / 管理画面連携API (結果入力・対戦カード・バッジ・自動進行など) が無効 (サーバ未設定) |
| -61 | 502 | 集計サーバのエラー |
| -62 | 502 | 管理画面側 (PHP) のサーバに接続できない、または処理を拒否された (結果入力・対戦カード・バッジなど管理画面の処理を通すAPI) |
| -99 | 500 | サーバ内部エラー |
8. 使用例 (curl)
# 開催中のトーナメント一覧
curl "https://push.n01darts.com/api/v1/tournament/list?status=30&count=20"
# トーナメント1件 (エントリー付き)
curl "https://push.n01darts.com/api/v1/tournament/get?tdid=XXXX"
# トーナメントの集計結果
curl "https://push.n01darts.com/api/v1/tournament/stats?tdid=XXXX&kind=stats_list"
# あるトーナメントの終了済みマッチをスタート時刻の昇順で
curl "https://push.n01darts.com/api/v1/match/list?tdid=XXXX&endMatch=1&sort=startTime&order=asc"
# チームのオーダー
curl "https://push.n01darts.com/api/v1/team/order/list?tdid=XXXX&tmid=YYYY"
# トーナメントのタイトルを更新
curl -u apiuser:apipass -H "Content-Type: application/json" \
-d '{"tdid":"XXXX","set":{"title":"Spring Open 2026"}}' \
"https://push.n01darts.com/api/v1/tournament/update"
# エントリーを追加
curl -u apiuser:apipass -H "Content-Type: application/json" \
-d '{"tdid":"XXXX","add":[{"name":"New Player","c":"JP"}]}' \
"https://push.n01darts.com/api/v1/tournament/entry/update"
# 自分が管理者のトーナメント一覧 (非公開のものを含む)
curl -u apiuser:apipass "https://push.n01darts.com/api/v1/tournament/list?owner=1"
# トーナメントを作成 (エントリー付き)
curl -u apiuser:apipass -H "Content-Type: application/json" \
-d '{"set":{"title":"Autumn Open","status":20,"join_pass":"pass1234"},
"entry_list":[{"name":"Player One","c":"JP"}]}' \
"https://push.n01darts.com/api/v1/tournament/create"
# リーグを作成
curl -u apiuser:apipass -H "Content-Type: application/json" \
-d '{"set":{"title":"Winter League"}}' \
"https://push.n01darts.com/api/v1/league/create"
# トーナメントを削除
curl -u apiuser:apipass -H "Content-Type: application/json" \
-d '{"tdid":"XXXX"}' \
"https://push.n01darts.com/api/v1/tournament/delete"
# 1回戦の第1試合の結果を入力 (勝者は次のラウンドへ)
curl -u apiuser:apipass -H "Content-Type: application/json" \
-d '{"tdid":"XXXX","ttype":"t","round":0,"t_no":1,"tpid":"aaaa","vsTpid":"bbbb","result":3,"vsResult":1}' \
"https://push.n01darts.com/api/v1/tournament/result/update"
# リーグの対戦カードを生成 (スイス式は次のラウンド)
curl -u apiuser:apipass -H "Content-Type: application/json" \
-d '{"tdid":"XXXX"}' \
"https://push.n01darts.com/api/v1/league/schedule/generate"
# 順位表
curl "https://push.n01darts.com/api/v1/tournament/standings?tdid=XXXX"
9. 動作サンプル
このマニュアルはAPIサーバ自身が配信しているため、以下のリンクは同じサーバの実際のAPIを呼び出します。 URLを押すと結果のJSONが新しいタブで開きます。「実行」を押すと、このページの下部に整形して表示します。
| サンプル | 内容 | |
|---|---|---|
health |
死活監視 | |
tournament/list?count=5 |
トーナメント一覧 (最新5件) | |
tournament/list?status__in=20,30&sort=updateTime&count=5 |
受付中/開催中を更新順に5件 | |
league/list?count=5 |
リーグ一覧 (最新5件) | |
match/list?count=5 |
マッチ一覧 (最新5件) | |
match/list?match_type=cricket&count=5 |
Cricketのマッチ5件 |
一覧の結果に含まれる tdid / lgid / mid を使って、
tournament/get?tdid=... や match/get?mid=... も同じようにブラウザのアドレスバーで試せます。
10. MCPサーバ
APIサーバは MCP (Model Context Protocol) のサーバとしても動作し、Claude Code などのAIエージェントから このAPIをツールとして直接呼び出せます。トランスポートは Streamable HTTP で、エンドポイントは1つです。
POST /api/v1/mcp
- 認証はREST APIと同じBasic認証か、OAuth 2.1 です。認証なしで接続するとデータ取得ツールだけが公開され、
公開画面と同じ範囲のデータを返します。認証すると、その管理者の大会については
管理用の項目も返し、作成・更新・削除ツールも使えるようになります (
admin_idの無いAPIユーザーでは 作成・更新・削除ツールは出ません。5. 認証)。 認証情報が誤っている場合はHTTP 401です。 - Basic認証を使う呼び出しにはREST APIと同じくAPIのサブスクリプションが必要です。無い場合や
期限切れの場合はツールの結果として
result: -42を返します (接続自体は切れません)。 - 各ツールは対応するREST APIと同じJSONを返します。引数もREST APIのクエリパラメータ /
リクエストボディと同じ名前です (一覧の絞り込みは
status__in: "20,30"のように 共通パラメータをそのまま指定します)。resultが0以外のときは ツールのエラー (isError) になります。 - 各ツールには
annotations(readOnlyHint/destructiveHint/idempotentHint/openWorldHint) を付けています。データ取得ツールは読み取り専用、 作成ツールは追加のみ、更新・削除ツールは既存のデータを置き換えたり消したりする破壊的な操作として クライアントに伝えます。 - セッションを持たないステートレスなサーバです (
Mcp-Session-Idは発行しません)。 応答は常にJSONで、サーバからのストリーム (SSE) は使いません。対応するプロトコルバージョンは2025-06-18と2025-03-26です。
ツール一覧
データ取得 (認証は任意)
| ツール | 対応するAPI |
|---|---|
n01_health | /api/v1/health |
n01_tournament_list | /api/v1/tournament/list |
n01_tournament_get | /api/v1/tournament/get |
n01_tournament_entry_list | /api/v1/tournament/entry/list |
n01_tournament_stats | /api/v1/tournament/stats |
n01_league_list | /api/v1/league/list |
n01_league_get | /api/v1/league/get |
n01_league_entry_list | /api/v1/league/entry/list |
n01_league_tournament_list | /api/v1/league/tournament/list |
n01_match_list | /api/v1/match/list |
n01_match_get | /api/v1/match/get |
n01_team_order_list | /api/v1/team/order/list |
n01_team_player_list | /api/v1/team/player/list |
n01_tournament_standings | /api/v1/tournament/standings |
n01_tournament_end_group | /api/v1/tournament/end_group |
n01_league_schedule_get | /api/v1/league/schedule/get |
n01_league_stats | /api/v1/league/stats |
n01_autopilot_get | /api/v1/autopilot/get (管理者の認証が必要) |
n01_autopilot_list | /api/v1/autopilot/list (管理者の認証が必要) |
データ作成・更新・削除 (Basic認証または OAuth。認証なしの接続では一覧に現れません)
| ツール | 対応するAPI |
|---|---|
n01_tournament_create | /api/v1/tournament/create |
n01_tournament_update | /api/v1/tournament/update |
n01_tournament_delete | /api/v1/tournament/delete |
n01_tournament_entry_update | /api/v1/tournament/entry/update |
n01_league_create | /api/v1/league/create |
n01_league_update | /api/v1/league/update |
n01_league_delete | /api/v1/league/delete |
n01_league_entry_update | /api/v1/league/entry/update |
n01_match_create | /api/v1/match/create |
n01_match_update | /api/v1/match/update |
n01_match_delete | /api/v1/match/delete |
n01_team_player_update | /api/v1/team/player/update |
n01_team_order_update | /api/v1/team/order/update |
n01_team_order_fix | /api/v1/team/order/fix |
n01_team_order_result | /api/v1/team/order/result |
n01_tournament_result_update | /api/v1/tournament/result/update |
n01_league_schedule_update | /api/v1/league/schedule/update |
n01_league_schedule_generate | /api/v1/league/schedule/generate |
n01_league_tournament_link | /api/v1/league/tournament/link |
n01_league_tournament_unlink | /api/v1/league/tournament/unlink |
n01_tournament_badge_update | /api/v1/tournament/badge/update |
n01_tournament_memo_update | /api/v1/tournament/memo/update |
n01_tournament_t_memo_update | /api/v1/tournament/t_memo/update |
n01_tournament_announce_update | /api/v1/tournament/announce/update |
n01_tournament_assign_update | /api/v1/tournament/assign/update |
n01_tournament_copy | /api/v1/tournament/copy |
n01_tournament_match_release | /api/v1/tournament/match/release |
n01_autopilot_update | /api/v1/autopilot/update |
Claude Code から接続する
# 取得のみ (認証なし)
claude mcp add --transport http n01 https://push.n01darts.com/api/v1/mcp
# 更新も行う (Basic認証)
claude mcp add --transport http n01 https://push.n01darts.com/api/v1/mcp \
--header "Authorization: Basic $(printf '%s' 'apiuser:apipass' | base64)"
プロジェクトで共有する場合は .mcp.json に書きます (認証情報は環境変数で渡します)。
{
"mcpServers": {
"n01": {
"type": "http",
"url": "https://push.n01darts.com/api/v1/mcp",
"headers": {"Authorization": "Basic ${N01_API_BASIC}"}
}
}
}
claude.ai から接続する
claude.ai の設定 → コネクタ → 「カスタムコネクタを追加」で URL に
https://push.n01darts.com/api/v1/mcp を登録します。認証に OAuth を選ぶと n01 のログイン画面が開き、
大会の管理に使っているアカウントでログインして許可すれば、その管理者として作成・更新・削除ツールも使えます
(OAuth 2.1)。「認証なし」で登録した場合はデータ取得ツールだけになります。