# REST API

Base URLは導入したWorkerのURLです。全データAPIに認証が必要です。`Authorization: Bearer <personal-token>` を指定します。更新は `Content-Type: application/json`。ブラウザのCookie認証は同一Originからのみ更新できます。

## 共通の約束

- IDはレスポンスから取得し、名前から推測しません。
- 更新には直前に取得した整数の `revision` を含めます。成功すると1増えます。
- 409は競合・重複・状態変化、428はrevision欠落、400は入力不正、401は未認証、403は権限不足、413は入力過大です。
- 更新を自動再送しません。通信断では一覧・履歴で実際の結果を確認します。
- 日付は `YYYY-MM-DD`、日時は `2026-10-01T10:00:00+09:00` のようにタイムゾーン付き。2000〜2100年を受け付けます。
- 数字は0以上の整数（最大1兆）。未計測は `null` または省略。金額はローンチの通貨単位の整数です。
- URLはHTTP/HTTPSのみ。認証情報を埋め込んだURLは禁止。

## 取得

| API                          | 内容                                                               |
| ---------------------------- | ------------------------------------------------------------------ |
| `GET /api/health`            | バージョンと稼働応答。未認証可。DBの正常性判定ではありません       |
| `GET /api/workspace`         | launches / tasks / content / links / metrics / members / templates |
| `GET /api/templates`         | テンプレート、進め方、チャネル                                     |
| `GET /api/activity?offset=0` | 操作履歴を100件ずつ。次はoffset=100                                |
| `GET /api/export`            | 認証情報を除く業務データのJSON                                     |

`members` は氏名・役割・状態だけです。メールは管理者の `GET /api/admin/members` に限定します。

## ローンチ

`POST /api/launches` → `{launch}`。必須 `name`（120文字以内）、`template`（product / seminar / campaign / blank）。

任意：`description`、`audience`、`offer`（各4000文字）、`launch_date`、`phase`（plan / create / review / live / learn）、`goal_leads`、`goal_sales`、`goal_revenue`、`currency`（JPY / USD / EUR）。

`PATCH /api/launches/:id` → `{launch}`。上記の項目（template以外）、`revision`、`status`（active / archived）。開催日変更はタスク期限を動かしません。

## タスク

`POST /api/tasks` → `{task}`。必須 `launch_id`、`title`（200文字）。

任意：`description`（5000文字）、`phase`、`status`（todo / doing / blocked / done）、`owner_id`（有効メンバーID、未設定はnull）、`due_date`、`channel`、`url`。

`PATCH /api/tasks/:id` → `{task}`。同項目のうち変更するものと `revision`。別ローンチへの付け替えはありません。

チャネル：general / email / line / x / instagram / web / event / other。

## 告知原稿

`POST /api/content` → `{content}`。必須 `launch_id`、`title`（200文字）。

任意：`body`（30000文字、プレーンテキスト）、`audience`（1000文字）、`channel`、`scheduled_at`、`external_url`。常にdraftで作成します。

`PATCH /api/content/:id` → `{content}`。上記の編集可能項目、`revision`、`status`。

状態遷移：draft → review → approved → published。review以降はdraftに戻せます。approved / publishedへの変更にはreview権限以上が必要です。承認には本文と対象が必要。実施済みには外部の記録URLが必要です。

承認と同時に本文等を変えることはできません。approved / publishedの原稿を変更した場合はdraftへ戻し、承認者・承認日時・実施日時を消去します。

**配信APIではありません。外部サービスへの送信は一切行いません。**

## リンク

`POST /api/links` → `{link}`。必須 `launch_id`、`title`、`url`。`category` はpage / payment / meeting / asset / other。

`PATCH /api/links/:id`：title / url / category / revision。

`DELETE /api/links/:id`：revision。登録したリンクだけを削除し、リンク先は操作しません。

## 日次実績

`POST /api/metrics` → `{metric}`。必須 `launch_id`、`date`、`channel`、`source`（数字の出典、300文字）。任意の `visits` / `leads` / `sales` / `revenue` / `cost` のうち1つ以上を記録します。

同じローンチ・日付・チャネルは1件です。既存行の訂正は最新 `revision` を含めます。省略した数字はnullになるため、訂正時は保持する数値も送ってください。日付・チャネルの変更は新規記録として扱います。

## 権限・トークン

閲覧はread、一般更新はdraft、原稿承認と実施記録はreview、メンバー管理はadmin。所有者の現在の権限でも再検査します。

`GET /api/tokens` は自分のトークン名・期限・権限だけを返します。発行・失効、招待・メンバー変更、パスワード変更は、管理画面の同一Originのセッションから操作します。

## 運用規模

1環境あたりローンチ200、手動タスク10000、原稿2000、リンク2000、日次実績20000件が目安の登録上限です。既存実績の訂正は上限到達後もできます。大規模組織向けのページング・プロジェクト単位の閲覧制限・承認ワークフローのカスタマイズは含みません。データを一括取得する設計なので、大量データでは環境を分割してください。
