目次

1. 概要

n01のトーナメント・リーグ・マッチ・チームオーダー・集計結果を外部システムから取得/更新するためのHTTP APIです。

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 で自分が管理者の大会だけに絞れます)。 一覧の共通パラメータで絞り込み・並べ替え・ページングができます。

絞り込みに使えるfieldtdid lgid title t_date status kind softdarts league game_type createTime updateTime
keywordタイトルのキーワード検索 (空白区切りでAND)
sortに使えるfieldcreateTime (既定・降順) updateTime t_date status title
既定で返すfieldtdid 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
entry0 を指定すると 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 で自分が管理者のリーグだけに絞れます)。

絞り込みに使えるfieldlgid title status createTime updateTime
keywordタイトルのキーワード検索
sortに使えるfieldcreateTime (既定・降順) updateTime title status
既定で返すfieldlgid 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

マッチの一覧を返します。非公開・削除済みのものは返しません。 既定ではアーカイブ (進行中のものを含む全マッチが同期されている) を検索します。

絞り込みに使えるfieldmid tdid tmid schid scid match_type endMatch endSchedule relayMode title startTime
playerプレーヤー名の部分一致 (大文字小文字を区別しない)。tdid と組み合わせて指定します (tdid が無いと -51)
live1 を指定すると進行中 (アーカイブへの整理前) のマッチだけを検索する
sortに使えるfieldstartTime (既定・降順) updateTime
既定で返すfieldmid 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>並べ替えのfieldsort=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_name
join_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_table
dw_table dl_table
ラウンドごとの配列で、各要素は tpid の配列。1回戦が [0]、2回戦が [1]。 まだ決まっていない枠は空文字
rr_tableグループごとの配列で、各要素はそのグループの tpid の配列
lg_tableディビジョンごとの配列で、各要素はそのディビジョンの tpid の配列。 不戦勝 (bye) の相手は "empty" で表す
t_result s2_result
dw_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数
lLeg数 (Set制の対戦のみ)
a平均
t100+
t4140+
t8180's
hHigh Out
bBest Leg
a_bSecond Legs
w_bBreak 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 color
theme 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)
SNS連携のID (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,
  "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 は丸ごと置き換わるので、実際には必要な項目をすべて入れてください。)

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のサブスクリプションの登録

サブスクリプションはトーナメントの支払い画面から登録します。

  1. トーナメントの管理画面 (設定) を開きます。
  2. 「トーナメント利用料について」のリンクから支払い画面へ進みます。
  3. 「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 を登録するだけで自動的に見つけます。

エンドポイント内容
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 も更新されます)。
トーナメントとリーグは、更新・削除の直前の状態が管理画面と同じようにバックアップされます (トーナメントはエントリー・組合せ・チームのメンバーとオーダーも含みます)。 バックアップは新しいものから10件まで残り、管理者に問い合わせると復元できます。

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文字まで)
status10=準備中 / 20=エントリー受付中 / 25=作成中 / 30=開催中 / 40=終了 (それ以外の値は拒否)。 30 にする更新は、有効な形式の対戦表 (lg_table / rr_table / t_table / s2_table / dw_table / m_table) が無いか空だと -3 で拒否する (管理画面の「対戦表が作成されていません」と同じ。 同じリクエストで対戦表を送れば通る)。既に 30 の大会は確認しない
private0 / 1 (一覧に表示しない)
entry_lock0 / 1 (エントリーのロック)
order_empty_error0 / 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_lose0 / 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で現在の値を読み、 必要な箇所だけ変えたものを送ることを推奨します (フィールド単位でそのまま置き換わるため)。 更新したフィールドは、その大会を開いている参加者・観戦画面にも再読み込みなしで反映されます (対戦表・結果・設定・バッジ・アナウンス・メモ・決勝割当・エントリー。管理画面からの保存と同じ通知)。

設定と対戦表を書くときの注意 (大会の進行に影響するもの)

管理画面が画面上で防いでいる矛盾のうち、APIでは検査されないものです。守らないと試合が始められない・終わらない・大会が完了しないといった形で進行に影響します。

形式が有効なら対戦表の形も管理画面が作るものと同じにしてください: 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_sns1 でそのエントリーの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_details0 / 1 (ポータルに説明を表示する)
image文字列 (画像URL。2000文字まで)
color背景色。CSSの色の値 (トーナメントと同じ)
private0 / 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_order1 (昇順) / -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文字まで)
private0 / 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整数。並び順
delete0 / 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値
ttypet 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 です。

進行処理は管理画面のPHPに大会の管理用トークンを付けて依頼します。管理画面側の処理を通すため、 このAPIと管理画面の挙動は常に同じです。管理画面側に接続できないときは 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_notournament/result/update と同じ
gs_round任意。ラウンド別のゲーム設定を引くラウンド (既定は round、lg はディビジョン)
p1res p2restpid / 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値
ttypet t3 s2 s2_3 dw dl m rr lg
round indexラウンドの添字と枠の添字 (枠 2k と 2k+1 の試合は t_no k+1)。バッジのキーは "<ttype>-<round>-<index>"
str台の表示 (40文字まで)。"" でバッジを消す
st0 無し / 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_ の接頭辞付き)値
typetop 上位 / low 下位 / custom グループの人数ごとに指定
countグループから抜ける人数 (1〜99)
placeholder complete refereetrue / false。未定枠に順位のプレースホルダを表示 / 完了したグループだけ割り当てる / 審判を設定する
referee_typelowest / 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文字まで。省略時は同じタイトル)
date1 で開催日も写す (既定 0)
entry1 でエントリーと対戦表も写す (既定 0。このときバッジ・試合順・試合メモも一緒に写る)
result1 で結果も写す (entry 1 が必要。既定 0)
guide1 でガイド (初期の対戦表 {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>.enable0 / 1。自動割当を動かす
remove_old_badge set_referee0 / 1。終了した試合のバッジを消す / 審判を設定する
referee_typesame_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コード一覧

resultHTTP意味
0200成功
-1404対象が見つからない (存在しない / 削除済み)
-3400更新フィールドが不正 (許可されていない / 値が不正)
-5402トーナメントの参加人数が主催者の支払い済みの上限を超えているため、開催中 (status 30) にできない
-6502人数上限を確認できなかった (支払いサーバのエラー)。開催中にはしない
-7409expect_update_time (対戦カードでは expect) より後に対象が更新されている。何も書き込まない
-40401認証エラー
-41403権限エラー (そのデータの管理者ではない / admin_idが未設定)
-42402APIのサブスクリプションが無い / 有効期限切れ
-43403送信元のIPアドレスからのアクセスが拒否されている
-50400 / 413 / 415リクエストボディが不正 (JSONとして解釈できない。1MBを超えると 413、Content-Type が application/json でないと 415)
-51400パラメータが不正
-52404エンドポイントが存在しない
-53405メソッドが不正
-54503検索に時間がかかりすぎた (一覧APIは10秒で打ち切る)。絞り込みを狭めて再試行する
-55429短時間のアクセスが多すぎる (送信元IPごとの上限。目安は1分あたり300件)。Retry-After ヘッダの秒数を待ってから再試行する。MCPも同じHTTP 429で拒否される
-60501集計API / 管理画面連携API (結果入力・対戦カード・バッジ・自動進行など) が無効 (サーバ未設定)
-61502集計サーバのエラー
-62502管理画面側 (PHP) のサーバに接続できない、または処理を拒否された (結果入力・対戦カード・バッジなど管理画面の処理を通すAPI)
-99500サーバ内部エラー

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

ツール一覧

データ取得 (認証は任意)

ツール対応する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)。「認証なし」で登録した場合はデータ取得ツールだけになります。