コンテンツにスキップ

レポート

レポート(report) は固定されたドキュメントです。テンプレート を、 フィルタ(ワークスペース・プロジェクト・ユーザー・タグ・日付範囲)の集合で、ある固定期間に対して レンダリングしたものです。レンダリングはレポートの作成・編集時に同期的に行われ、生成された Markdown は 不変かつバージョン管理されたスナップショットとして保存されます。そのため、ドキュメントは閲覧者・公開 共有・配信されたコピーの足元で変化することはありません。

レポートは作成したユーザーが所有します。相対的な日付範囲(this_week など)や生成日は、レンダリング時に 所有者のタイムゾーンで解決されます。日付と時刻 を参照してください。

フィールド 型 説明
id string 一意の識別子。
name string 表示名(1〜100 文字)。
ownerUserId string レポートを作成したユーザー。
templateId string このレポートにレンダリングしたテンプレート。外部キーではなく、テンプレートが削除されてもレポートは残ります。
filters object 解決済みのフィルタ集合(filters オブジェクト を参照)。保存される dateRange は常に絶対値。
note string | null {{ report.note }} でレンダリング本文に追記される自由記述の Markdown(20000 文字以下)。
totalMinutes integer | null 現在バージョンのエントリの合計分。この値の追跡前にレンダリングされたレポートは null(再レンダリングまで表示)。
snapshotProjectIds string[] | null 現在のスナップショットにエントリが現れる、重複なしのプロジェクト ID。レンダリング時に取得され、Send-to ACL を駆動します。null はスコープ不明(この取得の追加前にレンダリング)を意味します。レポートの送信 を参照。ワイヤには出力されますが @spantail/core の型付き reportSchema には含まれないため、ワイヤ専用の追加フィールドとして扱ってください。
version integer 現在のバージョン。作成時に 1、編集ごとに +1。
reportContentId string 現在のコンテンツバージョンの ID — コンテンツスコープのリソース(そのバージョンのディスカッション)のキー。
renderedMarkdown string 現在バージョンのレンダリング済みドキュメント。システム生成の YAML フロントマター(来歴)に、Liquid でレンダリングした本文が続きます。
createdAt string ISO 8601 の作成時刻。
updatedAt string ISO 8601 の最終更新時刻。

一覧のペイロードでは reportContentId と renderedMarkdown は省略されます。 GET /reports/:id でオンデマンドに取得してください。

フィールド 型 必須 説明
workspaceIds string[] はい 1〜20 のワークスペース。クロスワークスペースのレポートは呼び出し元のメンバーシップの和集合に限定されます。
projectIds string[] いいえ 絞り込み対象のプロジェクト(最大 50)。
userIds string[] いいえ 含める作成者(最大 50)。省略するとレポートは呼び出し元自身のエントリのみになります — これが既定で、Web アプリは常にこの挙動です。指定した作成者も呼び出し元のアクセス権の範囲に限定されます(読める エントリのみ含められます)。
tags string[] いいえ 最大 20 件のタグ。いずれかを持つエントリが一致。
dateRange object | string はい ワイヤ上はプリセット文字列か絶対範囲。保存済みレポートでは常に絶対値の { from, to }。

dateRange は プリセット(today、yesterday、last_7_days、last_30_days、this_week、 last_week、this_month、last_month のいずれか。サーバー側で所有者のタイムゾーンで解決。週は月曜始まり)か、絶対範囲 { "from": "YYYY-MM-DD", "to": "YYYY-MM-DD" }(両端含む。from ≤ to、最大 366 日)を受け付けます。 いずれを送っても、保存されるレポートは解決済みの絶対範囲を保持します。

GET /api/v1/reports scope: read

レポートのメタデータ(本文なし)を新しい順で返します。既定では呼び出し元自身のレポートを読みます。 インスタンス管理者は ownerUserId で他ユーザーの集合を、ワークスペースの管理者・オーナーは workspaceId で単一ワークスペースのレポート(そのワークスペースだけにスコープされたもの)を読めます。 所有者自身の一覧では、所有者がもはや完全には所属しないワークスペースを持つレポートの totalMinutes は null に伏せられます。

クエリパラメータ

名前 型 必須 説明
ownerUserId string いいえ インスタンス管理者専用: このユーザーのレポートを読む。
workspaceId string いいえ ワークスペース管理者・オーナー: このワークスペースの単一ワークスペースレポートを読む。
templateId string いいえ テンプレートで作成したレポートに絞り込み。
projectId string いいえ プロジェクトにスコープされたレポートに絞り込み。
from string いいえ 期間がこの日付以降に重なるレポートを残す YYYY-MM-DD。
to string いいえ 期間がこの日付以前に重なるレポートを残す YYYY-MM-DD。
limit integer いいえ ページサイズ 1〜200。省略すると絞り込み後の全件。
offset integer いいえ スキップ行数(既定 0)。
curl "https://<your-instance>/api/v1/reports?templateId=tpl_weekly&limit=50" \
  -H "Authorization: Bearer spantail_pat_yourtoken"

GET /api/v1/reports/template-ids scope: read

呼び出し元がレポートを持つ、重複なしのテンプレート ID を返します。すべてのレポートを読み込まずに、UI が 関連するテンプレートのタブを表示できます。

["tpl_weekly", "tpl_monthly"]

POST /api/v1/reports/preview scope: read

レポートを 保存せずに レンダリングします。作成ダイアログのライブプレビュー用です。作成と同じ メンバーシップ・テンプレート検証と同じレンダリングを実行するため、プレビューは保存される内容と一致します。 書き込みは行われないので read スコープで十分です。

リクエストボディは レポートの作成 と同一です。

curl -X POST "https://<your-instance>/api/v1/reports/preview" \
  -H "Authorization: Bearer spantail_pat_yourtoken" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Website — this week",
    "templateId": "tpl_weekly",
    "filters": {
      "workspaceIds": ["wrk_demo"],
      "projectIds": ["prj_site"],
      "dateRange": "this_week"
    }
  }'

suggestedName と suggestedNote は、テンプレートの nameTemplate / noteTemplate をこの スコープと期間でレンダリングした結果 — 作成フォームが初期値として埋める値です。テンプレートに その初期値が無い場合は両方とも空になります。

POST /api/v1/reports scope: write

ドキュメントをレンダリングし、バージョン 1 として保存します。呼び出し元は filters.workspaceIds のすべてのワークスペースに所属している必要があります。テンプレートは存在し、かつ 有効でなければなりません。無効なテンプレートは 400 を返します。テンプレートのレンダリングエラーも 400 を返すため、レンダリング不能な状態でレポートが保存されることはありません。

リクエストボディ

フィールド 型 必須 説明
name string はい 表示名(1〜100 文字)。
templateId string はい レンダリングするテンプレート。
filters object はい フィルタ集合(filters オブジェクト を参照)。
note string いいえ 本文に追記する自由記述の Markdown(20000 文字以下)。空文字は null に丸められます。
curl -X POST "https://<your-instance>/api/v1/reports" \
  -H "Authorization: Bearer spantail_pat_yourtoken" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Website — week of Jun 22",
    "templateId": "tpl_weekly",
    "filters": {
      "workspaceIds": ["wrk_demo"],
      "projectIds": ["prj_site"],
      "dateRange": { "from": "2026-06-22", "to": "2026-06-28" }
    }
  }'

201 Created を返します。

GET /api/v1/reports/:id scope: read

renderedMarkdown を含む単一のレポートを返します。読み取れるのは、所有者、インスタンス管理者、または 単一ワークスペースレポートのそのワークスペースの管理者・オーナーです(レポートが厳密に 1 つの ワークスペースにスコープされている場合のみ。複数ワークスペースのレポートはインスタンス管理者専用のまま)。 所有者にとってレンダリング本文はワークスペースデータであり、いずれかのフィルタ対象ワークスペースの メンバーシップを失うとアクセスは取り消されます。それ以外は 404 を返します。

PATCH /api/v1/reports/:id scope: write

所有者のみ。編集はレポートのフィールドを変更し、ドキュメントを 再レンダリング して、新しい不変の コンテンツバージョンを追加します。version は 1 つ増えます。リクエストボディは作成と同じ形(name・ templateId・filters をすべて送信)です。GET /:id と同じゲートが適用されます。所有者はすべての フィルタ対象ワークスペースに所属している必要があり、テンプレートは有効でなければならず、レンダリング エラーは 400 を返します。

curl -X PATCH "https://<your-instance>/api/v1/reports/rep_q2" \
  -H "Authorization: Bearer spantail_pat_yourtoken" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Website — week of Jun 22 (final)",
    "templateId": "tpl_weekly",
    "filters": {
      "workspaceIds": ["wrk_demo"],
      "projectIds": ["prj_site"],
      "dateRange": { "from": "2026-06-22", "to": "2026-06-28" }
    }
  }'

DELETE /api/v1/reports/:id scope: write

所有者のみ。共有と配信(それぞれが固定コピーを保持)はレポート行とともにカスケード削除されます。 204 No Content を返します。

GET /api/v1/reports/:id/recipients scope: read

所有者のみ。送信 の候補受信者を返します。レポートのワークスペース全体のメンバーの 和集合(すでにそのデータに資格のある人)から送信者を除き、snapshotProjectIds に取得された すべて の プロジェクトを読める人に絞り込みます(ワークスペースの管理者・オーナーは任意のプロジェクトを読め、 それ以外は各プロジェクトのメンバーである必要があります)。未割り当て/自身のエントリのみのレポートには プロジェクト制限はありません。snapshotProjectIds が null(スコープ不明)の場合、再レンダリングするまで 誰も対象になりません。

[
  { "id": "usr_bo", "name": "Bo", "email": "bo@example.com", "imageUrl": null }
]

POST /api/v1/reports/:id/send scope: write

所有者のみ。レポートの現在の 不変バージョン を各受信者の受信トレイに届けます。各受信者は 受信者 の候補集合に含まれている必要があり、送信でデータを見られる範囲を広げることはできません。 対象外の ID は 400 を返します。各配信は送信されたバージョンを参照するため、後で編集(新しいバージョンの 追加)があっても受信者は送られた内容を保持します。レポートを削除すると配信も削除されます。

リクエストボディ

フィールド 型 必須 説明
recipientUserIds string[] いいえ 最大 50 の受信者。既定は []。
sendToSelf boolean いいえ 送信者自身の受信トレイにもコピーを届ける。既定は false。
message string いいえ 受信者向けの短いメッセージ(1000 文字以下)。

受信者か sendToSelf のいずれかが必須です。

curl -X POST "https://<your-instance>/api/v1/reports/rep_q2/send" \
  -H "Authorization: Bearer spantail_pat_yourtoken" \
  -H "Content-Type: application/json" \
  -d '{
    "recipientUserIds": ["usr_bo"],
    "message": "Here is this week'\''s site report."
  }'

201 Created を返します。delivered はチームメイトの受信者のみを数え、自身へのコピーは数えません。

GET /api/v1/reports/:id/sends scope: read

レポートの送信履歴 — 送信バッチごとに 1 件、新しい順です。読み取りアクセスは 受信者や共有と同じ(オーナー、インスタンス管理者、またはそのレポートのワークスペースの 管理者)です。readCount は受信者自身の既読状態で、オーナー以外には 0 に伏せられます。 管理者が読んでも、単一の受信者がその送信を開いたかどうかは分かりません。

curl "https://<your-instance>/api/v1/reports/rep_q2/sends" \
  -H "Authorization: Bearer spantail_pat_yourtoken"