コンテンツにスキップ

API ガイド

Yagra が行うことはすべて、1 つの REST API を通じて駆動されます。このページでは、その認証方法と すべてのエンドポイントが従う規約を扱います。エンドポイントごとの詳細は生成された API リファレンスにあり、AI アシスタント向けには専用の入口 — MCP サーバー — が用意されています。

API はコアが API ポート(同梱の compose ファイルでは 8080)で提供し、すべてのパスが /api/v1 プレフィックスの下にあります — およそ 206 エンドポイント、加えてバージョンの付かない 2 つのヘルスプローブ GET /healthz(死活)と GET /readyz(レディネス。高可用性ペアではリーダー だけが 200 を返すため、ロードバランサはこれを使ってルーティングできます)です。

WebUI が行うことはすべて、この同じ API を通ります。 プライベートな裏口はありません。 インベントリ画面もダッシュボードもアラート操作も設定ページも、すべては /api/v1 呼び出しの列 なので、ブラウザで見えること・できることはすべて自動化できます。プログラムからどうやるか迷ったら、 ブラウザのネットワークタブを開いた状態で WebUI で一度やってみれば、正確なリクエストがわかります。

この API を認証する認証情報は 2 種類あり、どちらも Authorization: Bearer <token> で送ります。

  • セッショントークン — ユーザー名とパスワードと交換する短命のトークン。WebUI が使うもの。
  • API トークンyat_…設定 ▸ API トークンで発行)— 無人クライアント向けの長寿命の トークン。スクリプト・CI ジョブ・連携にはこちらを使ってください。

POST /api/v1/auth/login で、ユーザー名とパスワードを Bearer のセッショントークンと 交換します。

Terminal window
curl -s http://<yagra-host>:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "your-password"}'
{ "token": "<session-token>", "role": "admin" }

以後のリクエストにはこのトークンを付けます。

Terminal window
curl -s http://<yagra-host>:8080/api/v1/nodes \
-H "Authorization: Bearer <session-token>"

レスポンスにはアカウントのロールも含まれるため、クライアントは自分に何が許可されるかを最初から 把握できます。ログインはアカウント単位でも全体でもレート制限されており — 試行が多すぎると Retry-After ヘッダー付きの 429 を返します — POST /api/v1/auth/logout がトークンを失効させます。

無人の用途では、ログインをスクリプト化するのではなく API トークンを発行してください。管理者が 設定 ▸ API トークンで作成し、生の値は一度だけ表示されます。送り方はセッショントークンと まったく同じです。

Terminal window
curl -s http://<yagra-host>:8080/api/v1/nodes \
-H "Authorization: Bearer yat_…"

発行する前に知っておくべきことが 4 つあります。

  • 使える入口が決まっています。 rest を付けて作成したトークンだけが、この REST API に 届きます。この項目が存在する前に作られたトークンは mcp のみを持ち、ここでは 401 を返します。 アップグレードによって既存の認証情報の権限が広がることはありません。
  • アカウントとして動作します。 すべてのトークンには所有者がいます。実効ロールはトークンの ロールと所有者の現在のロールの低い方なので、アカウントを降格すれば直ちにトークンも狭まり、 無効化・削除すれば失効します。所有者にはサービスアカウントを推奨します (ユーザーと SSO を参照)。連携が、設定した担当者に依存 しなくなります。
  • ユーザー管理はできません。 POST /api/v1/users、API トークン自体のエンドポイント、その他 ユーザー管理権限で守られたものは、ロールによらずトークンに 403 token_not_permitted を返します。 自身の後継を発行できる認証情報は、元の失効を生き延びてしまうからです。
  • 対話的な識別子を持ちません。 「サインイン中のアカウント」を意味するエンドポイント (GET /api/v1/auth/me、個人ダッシュボード)は 403 session_required を返します。

作成時に有効期限(expires_at)を任意で指定でき、省略すれば無期限のままです。同じ画面からいつでも 失効させられ、失効は直ちに反映されます。

いくつかのエンドポイントは意図的に認証不要です。クライアントがログインする前にそれらを必要と するためで、いずれもインベントリ・設定・状態を明かしません。

エンドポイント 返すもの
GET /api/v1/version 動作中のコアのバージョン
GET /api/v1/config クライアントのブートストラップフラグ(認証・SSO・AI 分析が利用可能かどうか) — シークレットは含みません
GET /api/v1/openapi.json 生成された OpenAPI ドキュメント(後述)
GET /healthzGET /readyz 死活とレディネスのプローブ

デプロイを公開ダッシュボードのオプション付きで動かしている場合、読み取りエンドポイントは トークンなしで開放されます。書き込みは引き続き認証が必要です。

API 全体が 1 つのルールに従うため、あるエンドポイントで学んだことは残りにもそのまま通用します。

  • すべて JSON。 リクエストボディもレスポンスも JSON です。ボディを送るときは Content-Type: application/json を設定してください。

  • 作成は 201 を返し、新しいリソースの id を含みます: {"id": "<uuid>"}

  • 削除は 204 No Content を返します — ボディはなく、安全な範囲で削除は冪等です。

  • エラーは型付きです。 どの失敗も同じエンベロープで表現されます。

    { "error": { "code": "invalid_filter", "message": "" } }

    code は安定していて機械可読です — メッセージではなくこちらで分岐してください。message は オペレーターに見せて安全な文章で、内部のエラーテキストを含むことはありません。ステータスコードは 通常の意味に従います: 400 は不正な入力、401 は未認証、403 は認証済みだが権限なし、 404 は該当リソースなし、409 は競合、429 はスロットリング(Retry-After ヘッダー付き)、 502 は上流のストアまたはプロバイダの失敗(Yagra 自身の障害である 500 とは区別されます)、 503 はこのデプロイで設定されていない任意サブシステムです。

  • 可用性より先に認証が確認されます。 サブシステムが未設定のエンドポイントが 503 を返すのは、 すでに認証・認可を通った呼び出しに対してだけです。未認証のリクエストは常に 401 になります。 これは意図的な設計で、認証情報を持たない相手に「どのサブシステムを動かしているか」を開示しない ためです。(v0.1.19 より前は、ほとんどのエンドポイントで順序が逆でした。)

  • 大きな一覧はエンベロープに包まれ、上限が付きます。 無制限に伸びうる一覧は素の配列ではなく {"items": [...], "total": <n>, "truncated": <bool>} を返します — たとえば GET /api/v1/thresholds は 1 リクエストあたり最大 500 件のルールを返し、total には フィルタ前の件数が入ります。?limit= パラメータは上限を狭められますが、広げることはできません。

  • タイムスタンプは RFC 3339 の文字列(2026-08-01T09:30:00Z)で、レスポンスでも、時刻を取る クエリパラメータでも同じです。

すべてのリクエストは、トークンが持つロールによってエンドポイントごとに認可されます。

  • Viewer(閲覧者) — 読み取り専用: インベントリ、メトリクス、アラート、イベント、フロー。
  • Operator(オペレーター) — Viewer に加えてインシデント対応: アラートの確認(ACK)と ミュート、メンテナンスウィンドウの開始と終了、トラブルシュート分析と AI 根本原因説明の実行。
  • Admin(管理者) — 完全な制御: ノード、プロファイル、しきい値、認証情報、ユーザー、 監査ログ。

有効なトークンを持ちながらロールが足りないリクエストには 403 を返します — 未認証のリクエストが 受け取る 401 と区別できます。状態を変更するリクエストは自動的に監査ログに記録されます。 シングルサインオンを含むロールと権限のモデル全体はユーザーと SSO で説明しています。

API は自身の契約を GET /api/v1/openapi.json で公開します — すべてのパス、クエリパラメータ、 リクエストボディ、レスポンスの形、エラーコードを網羅した OpenAPI 3.1 ドキュメントです。これは ハンドラそのものから生成されるため、サーバーが実際に行うことを記述しており、コードから乖離 しえません。WebUI 自身の型と API クライアントも、この同じドキュメントから生成されています。 インベントリ・設定・状態を含まないため、認証なしで提供され、どのデプロイでも同一です。

任意の OpenAPI クライアントジェネレータをこれに向ければ、お好みの言語の型付きクライアントが 得られます。

Terminal window
curl -s http://<yagra-host>:8080/api/v1/openapi.json -o yagra-openapi.json

同じドキュメントはこのサイトの /openapi.json でも提供しているので、 動作中のデプロイがなくてもクライアントを生成できます。

エンドポイントごとのリファレンス — すべてのルートについて、パラメータ、ボディ、レスポンスを ドメイン別にまとめたもの — は、その同じドキュメントから生成され、サイドバーでこのページのすぐ下、 /ja/docs/api/reference/ にあります。生成物であるため、それが 記述するリリースと常に歩調が合っています。

API クライアントが気づきうる挙動の変更 — レスポンスの形、ステータスコード、既定値、クエリ パラメータの意味、削除されたエンドポイント — は必ずリリースノートに記載され、それぞれが出荷 されたバージョンの下に並びます。最近の例としては、素の配列だったレスポンスにエンベロープと上限が 付いたこと、削除と作成のエンドポイントが 204201 に揃ったこと、誰も呼んでいなかった エンドポイントがまるごと削除されたこと、そして一覧のフィールドが非推奨を挟まずより正確なものへ 置き換わったこと(v0.2.1 で nodes.sourcenodes.kind になり、2 値だった旧フィールドは同じ リリースで削除されました)などがあります。自動化がつながっているデプロイを アップグレードする前に、またぐバージョンのノートに目を通してください。その入手先は 変更履歴にあります。新しいデプロイの /api/v1/openapi.json から クライアントを再生成すれば、形の変更は機械的に取り込めます。

AI アシスタント向けには、専用に作られたもう 1 つの入口があります。/mcp で提供される オプトインの MCP サーバーで、監視状態をツールとして公開し — 大半は読み取り専用のクエリで、 加えて監査される少数の操作 — Claude Code や Claude Desktop のようなクライアントが「落ちている ノードは?」に直接答えられるようになります。認証は同じ yat_… の API トークンで、トークンは REST と MCP の両方を使えることも、片方だけに限ることもできます。アシスタント用の認証情報を mcp だけに留められること — それが、この項目が存在する理由です。専用のページもあります: MCP サーバー