Public API — /v1 リファレンス
正式仕様は OpenAPI 3.1 (apps/backend/openapi/public-api.yaml)。 本ドキュメントは概念ガイド。
ベース
| 要素 | 値 |
|---|---|
| Base URL | https://api.tas-cha.com/v1 |
| Staging | https://stg-api.tas-cha.com/v1 |
| Versioning | path (/v1) + 任意 Tascha-Version: 2026-06-09 |
| Auth | API key または OAuth bearer。 詳細: authentication.md |
| Request ID | X-Request-Id (任意送信、 未指定なら server 発行) |
| Idempotency | Idempotency-Key (write 系のみ、 任意 1-255 文字) |
エンドポイント (read)
| Method | Path | 必要 scope | units |
|---|---|---|---|
| GET | /v1/me | me:read | 1 |
| GET | /v1/organizations | organizations:read | 1 |
| GET | /v1/rooms | rooms:read | 1 |
| GET | /v1/rooms/:roomId/members | rooms:read | 1 |
| GET | /v1/rooms/:roomId/messages | messages:read | 1 |
| GET | /v1/rooms/:roomId/tasks | tasks:read | 1 |
| GET | /v1/rooms/:roomId/records | records:read | 1 |
| GET | /v1/rooms/:roomId/files | files:read | 1 |
DM ルーム (roomType=1) はすべて 404 (room_not_found) で返る。
エンドポイント (write)
| Method | Path | 必要 scope | units |
|---|---|---|---|
| POST | /v1/rooms/:roomId/messages | messages:write | 3 |
| POST | /v1/rooms/:roomId/tasks | tasks:write | 3 |
| PATCH | /v1/rooms/:roomId/tasks/:taskId | tasks:write | 3 |
| POST | /v1/rooms/:roomId/records | records:write | 3 |
| PATCH | /v1/rooms/:roomId/records/:recordId | records:write | 3 |
write の共通規約:
- user-actor token のみ。 acting user を持たない組織 API key 単独の write は
403
forbidden(メッセージ author / task・record creator が実在 user である必要があるため) - read より厳しい write 専用 burst limit (
apiWriteBurstPerMinute: 30) が併用される - record の更新は creator のみ。 locked / archived は 403
- リクエスト型は
PublicCreate*Request/PublicUpdate*Request(packages/common)
Idempotency-Key
write 系に Idempotency-Key ヘッダー (任意) を 付けると、 同一リクエストの再送に
同じ結果を返す (Stripe と同じ思想、 24h 保持):
- 同一 key + 異なるリクエスト内容 → 409
idempotency_conflict(reason: mismatch) - 元リクエストが in-flight 中の再送 → 409 (
reason: in_progress、 二重実行しない) - 失敗した key は再利用可能 (元の write が効果を持たないため)
- 結果 body は Redis cache + DB の両方に保持し、 cache が eviction / 再起動で 消えても 24h 以内なら DB から replay する
- 24h を過ぎた再送 → 409 (
reason: result_unavailable)。 黙って再実行はしない - 期限切れ row は日次 cron で物理削除される (テーブル無限成長の防止)
楽観ロック (task)
PATCH /v1/rooms/:roomId/tasks/:taskId は任意の version フィールドを受け取る。
指定時、 現在の task version と一致しなければ 409 version_conflict
(details.currentVersion に現在値)。 現在の version は write レスポンスで返る。
Pagination
cursor pagination (opaque base64url)。
リクエスト:
GET /v1/rooms?limit=20&cursor=eyJpZCI6Ii4uIn0
レスポンス:
{ "data": [...], "nextCursor": "eyJpZCI6Ii4uIn0" }
nextCursor === nullで終端cursorの中身は opaque (将来形式が変わっても互換)limitは endpoint 毎に上限あり (cap=200)