コンテンツにスキップ

API 概要

Spantail は単一の REST API を中心に構築されています。Web アプリ、CLIMCP サーバー はいずれも同じエンドポイントのクライアントです。これらが できることはすべて、HTTP で直接実行できます。

REST API はインスタンスの /api/v1 配下にあります。

https://<your-instance>/api/v1

<your-instance> は自分の Worker ドメイン(*.workers.dev の URL またはカスタムドメイン)に 置き換えてください。一部のエンドポイントは /api/v1 の外にあります。認証は /api/auth認証 を参照)、ヘルスチェック/api/health、 公開共有ビューは /share 配下です。

Spantail は 1.0 より前のため、/api/v1 はリリース間で破壊的に変更される可能性があります。

v1.0.0 以降、/api/v1 は追加のみとなります。エンドポイントやフィールドの追加はありますが、削除も 意味の変更も行いません。破壊的変更は既存の /api/v1 を残したまま /api/v2 として提供します。 クライアントは、知らないレスポンスフィールドを無視するように書いてください。

すべての /api レスポンスは x-spantail-version ヘッダーにインスタンスのバージョンを載せます。 追加のリクエストなしに、どのサーバと通信しているかを判別できます。

  • 原則 JSON。 リクエスト/レスポンスボディは application/json; charset=utf-8 です。ボディを 伴うリクエストには必ず Content-Type: application/json を付けてください。一部のエンドポイントは 代わりにバイナリを返します(例: アバターやワークスペースロゴの画像バイト)。詳細は各ページに記載します。
  • タイムスタンプ は UTC の ISO 8601 文字列です(例: 2026-06-28T09:30:00.000Z)。
  • 日付YYYY-MM-DD 形式のカレンダー日で、対象ユーザーのタイムゾーンで解釈されます (日付と時刻 を参照)。
  • 時間 は整数の分です。
  • ID は不透明な文字列です。パースや組み立てをしないでください。
  • リクエストボディの 未知のフィールド は拒否されます。ボディは厳格に検証されます。

ヘルス、共有ビュー、サインイン、招待の受諾といった一部の公開エンドポイントを除き、すべての エンドポイントは認証が必要です。セッション cookie、Personal Access Token、Agent Access Token の いずれかで認証できます。モデル全体、トークン形式、スコープは 認証 を 参照してください。

タイムゾーンはユーザー単位の概念です(user.timezonenull は UTC)。ワークスペースや プロジェクトにはタイムゾーンはありません。日付とタイムスタンプは独立しています。

  • 作業エントリの entryDate は作成者のタイムゾーンでのローカル日付文字列で、書き込み時に固定されます。
  • すべてのタイムスタンプは UTC の瞬間で、時間は整数の分です。
  • エージェントセッションはタイムスタンプのみを保持し、カレンダー日は読み取り時に閲覧者のタイムゾーンで startedAt から導出されます。
  • レポートは相対範囲と生成日を、実行ユーザーのタイムゾーンで解決します。

大きな結果セットを返しうる一覧エンドポイントは limitoffset クエリパラメータを受け付けます。 limit を省略したときの挙動はエンドポイント依存です。既定値と上限を持つもの(例: 作業エントリは 既定 50・上限 200)もあれば、limit を任意とし全件を返すものもあります。挙動は各エンドポイントの ページに記載しています。結果は素の JSON 配列で返るので、offset を増やしてページングします。

curl "https://<your-instance>/api/v1/work-entries?workspaceId=wrk_demo&limit=50&offset=50" \
  -H "Authorization: Bearer spantail_pat_yourtoken"

一覧エンドポイントはリソースごとのクエリパラメータを受け付けます。通常は workspaceId(必須)に 加え、任意の projectIduserIdtagfrom/to の日付範囲です。正確なパラメータは各リソースの ページに記載しています。

エラーは適切な HTTP ステータスと構造化された JSON ボディで返されます。スタックトレースは決して 公開されません。

{
  "error": {
    "code": "forbidden",
    "message": "Only the author can modify a work entry"
  }
}
コード HTTP 意味
bad_request 400 不正なリクエスト(検証失敗、不正な状態遷移)。
unauthorized 401 資格情報が欠落・無効・期限切れ。
forbidden 403 認証済みだが操作が許可されていない。
insufficient_scope 403 Personal Access Token に必要なスコープがない。
not_found 404 リソースが存在しない、または呼び出し元から隠されている。
conflict 409 現在の状態と競合(例: slug の重複)。
rate_limited 429 この資格情報のリクエストが多すぎる。バックオフして再試行。
internal 500 予期しないサーバーエラー。

書き込みや取り込みが多いエンドポイント(作業エントリの作成、エージェント活動の取り込み)は、 資格情報単位(トークン、またはセッションの場合はユーザー単位)でレート制限されます。上限を超えると コード rate_limited429 を返します。バックオフして再試行してください。

GET /api/health public は認証なしで { "status": "ok" } を返します。 稼働監視に使えます。