API キーと REST API
ダッシュボードで API キーを作り、REST API で登録済みのサーバーの採点を CI から保存し、評価を動かす方法と、エンドポイント、上限、誤りを説明します。
このページの内容
https://api.forecall.dev の REST API で、ダッシュボードに登録したサーバーの採点を保存して読み、評価を動かせます。OpenAPI の仕様書は api.forecall.dev/v1/openapi.json にあります。
API キー
キーは、組織の owner と admin がダッシュボードの API キーで作ります。キーには用途が 1 つあります。
- CI 用: ビルドから採点を保存します。ほかのことはできません。
- スクリプト用: 自分のスクリプトから使います。採点の保存もでき、評価にはこのキーを使います。
- エージェント用: 自分の AI エージェントが
mcp.forecall.devで Failure KB を使うためのキーです。失敗の照会と投稿だけができ、この REST API は呼べません。
キーは作ったときに一度だけ表示し、Forecall はハッシュしか残しません。なくしたら失効させて作り直します。キーは要求のたびに送ります。GET /v1/me は、キーの組織と用途を返します。
curl -H "Authorization: Bearer $FORECALL_API_KEY" https://api.forecall.dev/v1/me
CI から採点を保存する
POST /v1/servers/{id}/lint は、本文にサーバーの tools/list を受け取ります(受け付ける形のどれでも、1 MiB、200 ツールまで)。{id} はサーバーの ID で、ダッシュボードのサーバーの画面の URL(/servers/{id})の最後の部分です。?label= で版の名前を付けられます(50 文字まで)。
ダッシュボードと同じく、版を足すのはツールが最新の版と違うときだけで、採点は呼ぶたびに保存します。応答には、リンターと同じ結果と、前の版との違い(changes。採点した前の版がなければ null)が入ります。
GitHub Actions では、キーを secret に入れて次のようにします。
- run: npx forecall@0.2 dump -o tools.json -- node dist/server.js
- run: >
curl -fsS -X POST --data-binary @tools.json
-H "Authorization: Bearer ${{ secrets.FORECALL_API_KEY }}"
"https://api.forecall.dev/v1/servers/${{ vars.FORECALL_SERVER_ID }}/lint?label=${{ github.sha }}"
GET /v1/servers/{id}/lint/latest で、最新の版の最新の採点を読めます。
評価
評価は、ツールごとに作った発話(ケース)について、モデルがサーバーのどのツールを呼ぶかを聞き、引数も確かめます。Pro と Team のプランで使え、スクリプト用のキーが要ります。ケース、指標、単位と、ダッシュボードでの動かし方は「モデルでサーバーを評価する」で説明します。
POST /v1/servers/{id}/evaluations/estimate は、サーバーの最新の版を評価するのに使う単位を返します。単位は使いません。本文は省ける JSON です。
| 項目 | 内容 | 既定 |
|---|---|---|
models |
モデル(vendor/name): anthropic/claude-opus-5-5、anthropic/claude-sonnet-5-5、openai/gpt-6-astra、openai/gpt-6.1-sol(google/gemini-3.8-flash はいまは止めています) |
anthropic/claude-sonnet-5-5、openai/gpt-6.1-sol |
distractors |
モデルに一緒に見せる、同梱の公開サーバーのツール: bhived、context7、debugbase、filesystem、firecrawl、memory、notion、playwright |
なし |
lang |
発話の言語: en、Team なら ja も |
en |
ケースはツールごとに Pro で 8、Team で 20 で、どのツールも呼ぶべきでない発話と、取り違えやすいツールを狙った発話も少し入ります。同じ版と設定の評価がケースを持っていなければ、ケースを作る分も数えます。組織がすでに持っているモデルの結果は、数え直しません。応答には、今月の残りの単位とクレジット(balance)も入ります。
POST /v1/servers/{id}/evaluations は、同じ本文(と省ける name)を受け取り、見積もりの単位を使って評価を始めます。応答は 202 で、評価の id、モデルごとの実行の単位、進み具合を読む Location が入ります。今月の枠とクレジットが足りなければ 402 を返し、何も始めません。評価が失敗したら、終わらなかったケースの分の単位をクレジット(有効期間 6 か月)で返します。
curl -fsS -X POST -H "Authorization: Bearer $FORECALL_API_KEY" \
-d '{"models": ["anthropic/claude-sonnet-5-5", "openai/gpt-6.1-sol"]}' \
"https://api.forecall.dev/v1/servers/$SERVER_ID/evaluations"
GET /v1/evaluations/{id} は評価の状態(queued、running、done、failed)、ケースの数、モデルごとの答えたケースの数と、実行が終わったら指標を返します。指標は selectionAcc(期待するツールを呼んだ割合)、argValidity(そのときの引数が正しかった割合)、falseCallRate(呼ぶべきでないのに呼んだ割合)、confusion(代わりに呼んだツール)です。
上限
キーごとに、1 分あたりの要求の数に上限があります(組織のプランで決まります)。超えると 429 と Retry-After を返します。採点の保存は、組織の月(UTC)の枠から 1 単位を使い、キーの用途ごとに数えます。枠と組織のクレジットを使い切ると、保存は 402 を返し、何も保存しません。評価は、見積もりの単位をスクリプト用のキーの枠から使います。読むだけ、見積もるだけなら単位は使いません。今月の使用量は、ダッシュボードの API キーの画面で見られます。
誤り
誤りはすべて同じ形({"error": {"code": "…", "message": "…"}})で、入力の誤りには場所を示す detail(パス、直すキー、重なった名前)が付きます。
| 状態 | code |
|---|---|
| 401 | unauthorized: キーがない、違う、失効している |
| 402 | quota_exceeded、plan_has_no_evaluations、payment_failed(組織の直前の支払いに失敗している間。ダッシュボードの「プランと請求」でカードを直す) |
| 404 | not_found: キーの組織にそのサーバーか評価がない、まだ版か採点がない |
| 413 | input_too_large |
| 422 | invalid_json、unrecognized_shape、invalid_tool、too_many_tools、snake_case_keys、duplicate_names、invalid_label、invalid_request、unknown_models、unknown_distractors、lang_not_in_plan |
| 429 | rate_limited |