1. 認証フロー
運用は2段階です。最初に Supabase JWT で APIキーを発行し、以後は APIキーでコンテンツAPIを利用します。
- JWT: `Authorization: Bearer <SUPABASE_ACCESS_TOKEN>`
- APIキー: `x-api-key: <ISSUED_API_KEY>` または `Authorization: Bearer <ISSUED_API_KEY>`
2. APIキー管理API(JWT必須)
POST /api/v1/api-keys
APIキーを発行します。`scope` は `read` / `write`。
curl -X POST "https://api.maaark.jp/api/v1/api-keys" \
-H "Authorization: Bearer <SUPABASE_ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"name":"external-app","scope":"write"}'
GET /api/v1/api-keys
DELETE /api/v1/api-keys/:id
3. コンテンツAPI(APIキー利用)
POST /api/v1/contents
GET /api/v1/contents
GET /api/v1/contents/:id
PATCH /api/v1/contents/:id
DELETE /api/v1/contents/:id
POST /api/v1/contents/:id/open
`scope=read` のAPIキーは読み取り専用です。書き込み操作を実行すると `403 E_FORBIDDEN` を返します。
curl -X GET "https://api.maaark.jp/api/v1/contents?limit=20" \
-H "x-api-key: <ISSUED_API_KEY>"
4. 管理API(管理者JWT必須)
GET /api/v1/admin/api-key-usage
APIキー使用状況を集計して返します。`ADMIN_USER_IDS` に含まれるユーザーのみ利用できます。
- query: `hours`, `limit`, `status(active|revoked|all)`, `sort(totalRequests|rateLimitedRequests|lastUsedAt)`
curl -X GET "https://api.maaark.jp/api/v1/admin/api-key-usage?hours=24&status=all&sort=lastUsedAt" \
-H "Authorization: Bearer <ADMIN_SUPABASE_ACCESS_TOKEN>"
5. 主なエラーコード
- `E_AUTH_REQUIRED` (401)
- `E_AUTH_INVALID` (401)
- `E_FORBIDDEN` (403)
- `E_URL_INVALID` (400)
- `E_URL_DUPLICATED` (409)
- `E_RATE_LIMITED` (429)
6. セキュリティ注意
- `service_role` キーをクライアント側に置かない
- APIキー漏えい時は即時失効(`DELETE /api/v1/api-keys/:id`)
- 本番運用では `ApiAccessLog` と `429` 発生率を日次監視する