Skip to content

REST API リファレンス ​

Web アプリでできる操作の大半は、/api/v1 の JSON REST API からも行えるので、スクリプトから使えます。このページでは、認証の方法、リクエスト・レスポンス・エラーの形、リソースごとのエンドポイント一覧、curl の実例を説明します。Python を使う場合は、Python クライアントが主な呼び出しをラップしています。

例では、Fione が http://localhost:8080 にあり、API トークンを <your-token> と表記します。

対話的なスキーマ ​

稼働中の Fione は自分自身の OpenAPI スキーマを配信しています。実行しているバージョンに対して常に正確です。

アドレス内容
/api/docs対話的なドキュメント(Swagger UI)。各呼び出しをその場で試せます。
/api/openapi.jsonOpenAPI スキーマ。クライアントの自動生成に使えます。

どちらもトークンは不要です。このページは API の案内で、各リクエストの全フィールドはスキーマで確認できます。

認証 ​

スクリプトは、Authorization ヘッダーに API トークンを付けて認証します。トークンはアカウント画面で作成します(ユーザー・ロール・共有を参照)。

sh
curl -H "Authorization: Bearer <your-token>" http://localhost:8080/api/v1/auth/me
json
{
  "user": { "id": 1, "username": "alice", "role": "editor" },
  "csrf_token": null
}

トークンは持ち主として動作し、持ち主のロールとプロジェクトがそのまま使われます。リクエストに Authorization: Bearer ヘッダーがあるときは、トークンだけが検証されます。トークンがない、不明、または無効の場合は 401(WWW-Authenticate: Bearer つき)になります。

トークンでトークンの作成や無効化もできるため(POST /tokens、DELETE /tokens/{id})、秘密にしてください。

ブラウザのセッション

Web アプリは POST /auth/login とセッション Cookie でログインします。Cookie を使ってデータを変更するリクエスト(POST、PUT、PATCH、DELETE)では、セッションの csrf_token を X-CSRF-Token ヘッダーでも送る必要があります。送らないと、コード csrf の 403 で拒否されます。ベアラートークンのリクエストでは CSRF ヘッダーは不要なので、スクリプトではトークンを使ってください。

共通の規則 ​

  • 本文: リクエストとレスポンスは JSON(Content-Type: application/json)です。ファイルのアップロード(multipart/form-data)とダウンロードは例外です。エンドポイントが知らないフィールドを含む本文は拒否されます(422)。
  • ID: プロジェクトの ID は iris-demo-2e9b75 のような文字列です。データセット、ジョブ、モデル、ユーザー、トークンの ID は整数です。
  • 日時: プロジェクト、データセット、トークンの created_at は UTC の "YYYY-MM-DD HH:MM:SS" です。ジョブ、モデル、ジョブのイベントは秒単位の Unix 時間です。
  • 一覧はページングなしの JSON 配列で返ります。GET /jobs は新しい順に limit 件(初期値 200、最大 1000)を返します。
  • サイズの上限: JSON 本文は 1 MiB まで、CSV のアップロードは FIONE_MAX_UPLOAD_BYTES(初期値 1 GiB。設定リファレンスを参照)まで、モデルのインポートは 512 MiB までです。
  • 見え方: 読めないプロジェクトは、あなたにとっては存在しないものとして扱われ、403 ではなく 404 になります。プロジェクトを読めても、呼び出しに必要な権限がない場合は 403 です。

使用例 ​

データをアップロードしてモデルを学習する ​

プロジェクトを作成し、CSV をアップロードし、AutoML の学習をキューに入れます。アップロードは、name、type(train、test、predict)、file を持つ multipart フォームです。

sh
curl -X POST http://localhost:8080/api/v1/projects \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Iris demo"}'
# {"id": "iris-demo-2e9b75", "name": "Iris demo", "owner_id": 1, "created_at": "2026-11-07 06:02:46"}

curl -X POST http://localhost:8080/api/v1/projects/<project-id>/datasets \
  -H "Authorization: Bearer <your-token>" \
  -F name=train -F type=train -F file=@train.csv
# {"id": 1, "name": "train", "type": "train", "n_rows": 120, "n_cols": 4, "schema": [...], ...}

curl -X POST http://localhost:8080/api/v1/projects/<project-id>/jobs/automl \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{"dataset_id": 1, "config": {"target": "species", "max_runtime_secs": 300}}'
# {"id": 1, "kind": "automl", "status": "queued", ...}

config に指定できるオプションは、Python クライアントの「学習・待機・予測」にある表のとおりです。無効な設定や、エンジンが受け付けない目的列は 422 になり、ジョブはキューに入りません。

ジョブの進行を確認する ​

学習はバックグラウンドで実行されます。status が done、failed、cancelled のいずれかになるまでジョブを取得します。

sh
curl -H "Authorization: Bearer <your-token>" http://localhost:8080/api/v1/jobs/1
json
{
  "id": 1,
  "kind": "automl",
  "status": "done",
  "result": { "model_id": 1, "best_model": "Ensemble", "stop_reason": "time", "metrics": { "accuracy": 0.92 } },
  "message": null,
  "created_at": 1794031373.97,
  "started_at": 1794031377.2,
  "finished_at": 1794031418.1
}

result.model_id が学習済みモデルです(上のレスポンスは省略したもので、実際のジョブには payload などもあります)。実行中の進捗は、ジョブのイベントで確認できます。返ってきた last_id を次の after に渡します。

sh
curl -H "Authorization: Bearer <your-token>" "http://localhost:8080/api/v1/jobs/1/events?after=0&limit=100"
# {"events": [{"id": 1, "type": "started", "ts": ..., "data": {...}}, ...], "last_id": 3, "status": "running"}

データセットを予測する ​

予測したい行を predict データセットとしてアップロードし、バッチ予測をキューに入れ、結果をダウンロードします。

sh
curl -X POST http://localhost:8080/api/v1/projects/<project-id>/jobs/batch-predict \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{"model_id": 1, "dataset_id": 2}'

# ジョブが完了すると、result.dataset_id が予測結果のデータセットです
curl -H "Authorization: Bearer <your-token>" \
  http://localhost:8080/api/v1/projects/<project-id>/datasets/3/download
text
"predict","p_setosa","p_versicolor","p_virginica","sepal_length","sepal_width","petal_length"
"virginica",0.0009,0.0068,0.9923,6.6,3.3,5

結果には、predict 列、分類ではクラスごとの p_<クラス名> 列、そして入力列(include_columns を指定した場合はその列だけ)が含まれます。"include_contributions": true を加えると、各行の寄与度も得られます(最大 100,000 行)。

1 行ずつ説明する ​

POST /models/{id}/contributions はジョブを使わず、すぐに答えを返します。列名をキーにしたオブジェクトを最大 100 件、instances で送ります。

sh
curl -X POST http://localhost:8080/api/v1/models/1/contributions \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{"instances": [{"sepal_length": 5.1, "sepal_width": 3.5, "petal_length": 3.6}]}'
json
{
  "model_id": 1,
  "outputs": ["setosa", "versicolor", "virginica"],
  "rows": [
    {
      "row": 0,
      "prediction": 0.987,
      "class_index": 0,
      "bias": 0.109,
      "contributions": { "sepal_length": 0.294, "sepal_width": 0.233, "petal_length": 0.351 }
    }
  ]
}

各行の bias と contributions を合計すると prediction になります。instances の代わりに、dataset_id と offset、limit を指定することもできます。

エンドポイント ​

パスはすべて /api/v1 からの相対パスです。最後の列は、そのエンドポイントを呼べる人です。「読み取り」「書き込み」「所有者」は、そのオブジェクトが属するプロジェクトでの権限です(ユーザー・ロール・共有を参照)。管理者はどこでもすべての権限を持ち、ロールが閲覧者のユーザーは読み取りまでです。

システム ​

メソッドとパス内容呼べる人
GET /health稼働確認: {"status": "ok", "version": "..."}誰でも(トークン不要)
GET /system/statusバージョン、イメージタグ、ストレージの種類、ジョブランナーの状態、待機中・実行中のジョブ数、言語モデルの状態。ログイン済み

認証 ​

メソッドとパス内容呼べる人
GET /auth/me現在のユーザー。ログイン済み
GET /auth/status{"needs_first_admin": true または false}誰でも
POST /auth/first-adminusername、password、setup_token で最初の管理者を作成します。管理者がいる場合は拒否されます(409)。誰でも(セットアップトークンが必要)
POST /auth/login、POST /auth/logoutブラウザのセッションを開始・終了します。誰でも / ログイン済み
POST /auth/password自分のパスワードを変更します: current_password、new_password(8 文字以上)。ほかのセッションは終了し、トークンはそのまま使えます。ログイン済み

ユーザーとトークン ​

メソッドとパス内容呼べる人
GET /users全ユーザー: id、username、role。管理者
POST /usersusername、password、role(admin、editor、viewer)でユーザーを作成します。管理者
PATCH /users/{user_id}role や password を変更します。自分の管理者ロールを外す操作は拒否されます(409)。管理者
DELETE /users/{user_id}ユーザーを削除します。最後の管理者、自分自身、プロジェクトやジョブを持つユーザーは拒否されます(409)。管理者
POST /tokensname を指定して自分のトークンを作成します。レスポンスに平文の token が含まれ、表示されるのは一度だけです。ログイン済み
GET /tokens自分のトークン一覧(トークン本体は含まれません)。管理者は user_id を指定できます。ログイン済み
DELETE /tokens/{token_id}トークンを無効にします。持ち主または管理者

プロジェクトと共有 ​

メソッドとパス内容呼べる人
GET /projects見られるプロジェクト一覧。ログイン済み
POST /projectsname(1〜100 文字)でプロジェクトを作成します。管理者または編集者
GET /projects/{project_id}プロジェクトと、その owner、あなたの access(owner、editor、viewer)、members。読み取り
DELETE /projects/{project_id}ジョブを停止してから、データセット、モデル、ジョブごとプロジェクトを削除します。所有者
POST /projects/{project_id}/shareusername と access(editor か viewer)で共有します。もう一度共有すると権限が変わります。所有者
DELETE /projects/{project_id}/share/{username}メンバーを外します。所有者

データセット ​

メソッドとパス内容呼べる人
GET /projects/{project_id}/datasetsプロジェクトのデータセット一覧。読み取り
POST /projects/{project_id}/datasetsmultipart の name、type、file で CSV をアップロードします。書き込み
GET /projects/{project_id}/datasets/{dataset_id}列の schema つきの 1 つのデータセット。読み取り
DELETE /projects/{project_id}/datasets/{dataset_id}データセットを削除します。書き込み
GET /projects/{project_id}/datasets/{dataset_id}/downloadUTF-8 の CSV としてのデータセット。読み取り
GET /projects/{project_id}/datasets/{dataset_id}/preview?rows=50先頭の行(最大 200)を {"columns": [...], "rows": [[...]]} の形で。読み取り
GET /projects/{project_id}/datasets/{dataset_id}/profile先頭 100,000 行の列の統計量、ヒストグラム、相関。?target=<列名> を付けるとリークの疑いも返します。読み取り
GET /projects/{project_id}/datasets/{dataset_id}/columns/{column}1 列のプロファイル。読み取り

ジョブ ​

学習、予測、説明、モジュール、エクスポートは、すべてジョブです。ジョブを投入すると、キューに入ったジョブがステータス 201 で返ります。

メソッドとパス内容呼べる人
POST /projects/{project_id}/jobs/automltrain データセットで学習します: dataset_id、config(target を含む)、任意で name。書き込み
POST /projects/{project_id}/jobs/batch-predictモデルでデータセットを予測します: model_id、dataset_id、任意で include_columns、name、include_contributions。書き込み
POST /projects/{project_id}/jobs/explainモデルの保存済みの説明を計算し直します: model_id、任意で dataset_id。書き込み
POST /projects/{project_id}/jobs/modulePython モジュールを実行します: module_id、dataset_id、params、任意で name。書き込み
POST /projects/{project_id}/jobs/exportプロジェクトの全モデルを 1 つの zip にエクスポートします。完了後に GET /projects/{project_id}/exports/{job_id} でダウンロードします。プロジェクトごとに同時に 1 つまでです(超えると 409)。読み取り
GET /jobs新しい順のジョブ一覧。project_id と status で絞り込めます。limit の初期値は 200 です。ログイン済み
GET /jobs/{job_id}1 つのジョブ。読み取り
GET /jobs/{job_id}/eventsイベント ID after より後のイベントを limit 件まで(初期値 500、最大 1000)。last_id とジョブの status も返ります。読み取り
POST /jobs/{job_id}/cancel待機中または実行中のジョブをキャンセルします。終了済みのジョブは 409 です。書き込み
DELETE /jobs/{job_id}終了済みのジョブを、イベントとログごと削除します。書き込み
DELETE /jobs?project_id=<id>プロジェクトの終了済みジョブをすべて削除します。書き込み

ジョブには、id、kind(automl、batch_predict、explain、module、export_models)、project_id、owner_id、status(queued、running、done、failed、cancelled)、投入時の payload、result、message、stop_reason、degraded、日時の created_at、started_at、finished_at があります。管理者以外には、エラーメッセージの最初の行だけが表示され、スタックトレースやファイルパスは含まれません。

モデル ​

メソッドとパス内容呼べる人
GET /projects/{project_id}/modelsプロジェクトのモデルと指標。読み取り
GET /models/{model_id}設定、リーダーボード、試行、変数の重要度を含む 1 つのモデル。読み取り
DELETE /models/{model_id}モデルを削除します。書き込み
GET /models/{model_id}/export再びインポートできる zip としてのモデル。読み取り
POST /projects/{project_id}/models/importエクスポートした zip をインポートします(multipart の file、任意で trust_foreign)。管理者
GET /models/{model_id}/servingFione Serving 用のバンドル(zip)。読み取り
GET /models/{model_id}/serving/infoバンドルを動かすコマンド、呼び出し例、zip に含まれるファイル。読み取り
GET /projects/{project_id}/exports/{job_id}完了したエクスポートジョブの zip。読み取り

説明 ​

メソッドとパス内容呼べる人
GET /models/{model_id}/diagnostics交差検証による混同行列、クラスごとの指標、曲線、残差。読み取り
GET /models/{model_id}/explanations保存済みの説明(重要度と部分依存曲線)と、その status。読み取り
POST /models/{model_id}/contributions各行の寄与度。最大 100 件の instances、または dataset_id と offset、limit。任意で class_index。読み取り
POST /models/{model_id}/partial-dependencecolumn を変えたときの平均出力の変化。任意で dataset_id、grid、rows、ice、class_index。読み取り

Python モジュール ​

メソッドとパス内容呼べる人
GET /modules組み込みとアップロード済みのすべてのモジュールと、その kind、パラメーターのスキーマ。ログイン済み
POST /modulesmultipart の id と file でモジュールをアップロードします。レスポンスに、アップロードしたモジュールがサンドボックス化されないことを示す warning が含まれます。管理者
DELETE /modules/{module_id}アップロード済みのモジュールを削除します。組み込みは削除できません。管理者

エラー ​

エラー応答は常に JSON で、人間向けの error と、変わらない code を持ちます。

json
{ "error": "target column 'nope' is not in the data", "code": "invalid" }
ステータスcode発生する場合
400bad_requestリクエストの形式が不正です。
401unauthorizedトークンがない、または無効・取り消し済みです。ログイン情報の誤りは invalid_credentials です。
403forbiddenプロジェクトは見られるが、呼び出しに必要なロールや権限がありません。ほかに、CSRF トークンのない Cookie リクエストの csrf、ほかのサイトの Origin の cross_origin、セットアップトークンの誤りの invalid_setup_token、POST /auth/password で現在のパスワードが違う場合の invalid_credentials があります。
404not_foundオブジェクトが存在しないか、そのプロジェクトを読めません。
405method_not_allowedそのパスはありますが、この HTTP メソッドでは使えません。
409conflict今はその変更ができません(最後の管理者、終了済みのジョブ、実行中のエクスポートなど)。ほかに already_set_up、説明での untrusted、too_large があります。
413too_largeリクエスト本文やアップロードが上限を超えています。
415unsupported_media_typeサインインまたは最初の管理者の作成で Content-Type が JSON でない場合、またはアップロードで multipart/form-data でない場合です。そのほかの JSON の呼び出しで Content-Type が違うときは 422 invalid が返ります。
422invalidフィールドが不足または不正、あるいはサービスが値を拒否しました。読み取れない CSV は invalid_csv です。
429throttledパスワードの確認の失敗が多すぎます。Retry-After ヘッダーの秒数だけ待ってください。
500internal想定外のエラーです。詳細はレスポンスではなく、サーバーのログにあります。
503busyほかの説明を計算中です。Retry-After ヘッダーの後で再試行してください。

この表は代表的なステータスです。呼び出しによっては、ステータスに独自の code が付きます(たとえばモデルのインポートでの untrusted は 422 です)。ログインの制限については、ユーザー・ロール・共有と設定リファレンスを参照してください。