ファイル API リファレンス
プロジェクトの共有ファイル、フォルダ、リビジョン履歴を操作する API です。
認証・エラー形式・ロールは REST API リファレンスの共通仕様 を参照してください。このページの auth 列は、読む = 全 project member、書く = owner / admin / member、admin = owner / admin を表します。
前提
- project でファイル機能が有効であること。無効な project への呼び出しは
404です。 {projectId}、{fileId}、{folderId}は UUID、{revision}は 1 始まりの整数です。- フォルダは最大 5 階層です。フォルダを自分自身や子孫の下へ移動することはできません。
- 同じフォルダへ同名のファイルをアップロードすると、新しいファイルではなく新しいリビジョンになります。名前は大文字小文字を区別する完全一致で比較します。
- リビジョンはファイルごとに直近 10 版を保持します。古い版と対応する添付は自動的に削除対象になります。
- ストレージ容量は課題・Wiki の添付と共用です。現在の上限は Free が project ごとに 100 MB、Pro が 10 GB です。上限超過は添付のアップロード開始時に
402 plan_limitとなります。
アップロードの流れ
- 添付 API の
POST /api/projects/{projectId}/attachmentsで presigned PUT URL を取得します。 - 取得した URL へファイルを PUT し、
POST /api/projects/{projectId}/attachments/{attachmentId}/completeで添付をreadyにします。 POST /api/projects/{projectId}/filesにattachmentIdを渡します。
指定できるのは、認証ユーザー自身がアップロードした、未紐付けかつ ready の添付だけです。
ツリー
/api/projects/{projectId}/files/tree読むproject のフォルダ、各ファイルの最新リビジョン、ストレージ使用量を一括で返します。
{
"folders": [
{
"id": "folder-uuid",
"parentId": null,
"name": "設計資料",
"updatedAt": "2026-08-31T01:23:45.678Z"
}
],
"files": [
{
"id": "file-uuid",
"folderId": "folder-uuid",
"name": "要件定義.pdf",
"currentRevision": 2,
"size": 2048,
"mime": "application/pdf",
"createdBy": { "id": "user-uuid", "displayName": "山田" },
"updatedBy": { "id": "user-uuid", "displayName": "山田" },
"updatedAt": "2026-08-31T02:00:00.000Z"
}
],
"usage": {
"usedBytes": 4096,
"limitBytes": 104857600
}
}
createdBy と updatedBy はユーザーを解決できない場合 null です。usedBytes は project の pending または ready の添付が予約・使用している合計バイト数です。limitBytes はプランの上限バイト数で、上限なしのプラン設定では null になり得ます。
| status | 意味 |
|---|---|
200 | { folders, files, usage } |
403 | project を読む権限がない |
404 | project が見つからない、またはファイル機能が無効 |
ファイル
/api/projects/{projectId}/files書くupload 完了済みの添付を共有ファイルとして登録します。同じフォルダに同名ファイルがあれば、新しいリビジョンを追加します。
{
"attachmentId": "attachment-uuid",
"folderId": "folder-uuid",
"name": "要件定義.pdf"
}
| field | 条件 |
|---|---|
attachmentId | 必須。自分がアップロードした未紐付けの ready 添付 UUID |
folderId | 同じ project のフォルダ UUID。省略または null はルート |
name | 省略時は添付の filename。1〜255 文字 |
{
"file": {
"id": "file-uuid",
"folderId": "folder-uuid",
"name": "要件定義.pdf",
"currentRevision": 2,
"size": 2048,
"mime": "application/pdf",
"createdBy": { "id": "user-uuid", "displayName": "山田" },
"updatedBy": { "id": "user-uuid", "displayName": "山田" },
"updatedAt": "2026-08-31T02:00:00.000Z"
},
"revision": 2
}
| status | error | 意味 |
|---|---|---|
201 | — | { "file": ProjectFile, "revision": number } |
400 | 入力エラー文 | 添付、名前、UUID が不正 |
403 | 権限エラー文 | owner / admin / member ではない |
404 | folder_not_found | 指定フォルダが見つからない |
409 | file_conflict | 同名アップロードが同時実行され競合した |
/api/projects/{projectId}/files/{fileId}読むファイルの最新メタ情報と、リビジョンを新しい順で返します。
{
"file": {
"id": "file-uuid",
"folderId": null,
"name": "要件定義.pdf",
"currentRevision": 2,
"size": 2048,
"mime": "application/pdf",
"createdBy": { "id": "user-uuid", "displayName": "山田" },
"updatedBy": { "id": "user-uuid", "displayName": "佐藤" },
"updatedAt": "2026-08-31T02:00:00.000Z",
"revisions": [
{
"revision": 2,
"size": 2048,
"mime": "application/pdf",
"uploadedBy": { "id": "user-uuid", "displayName": "佐藤" },
"createdAt": "2026-08-31T02:00:00.000Z"
}
]
}
}
uploadedBy はユーザーを解決できない場合 null です。
| status | 意味 |
|---|---|
200 | { "file": ProjectFileDetail } |
403 | project を読む権限がない |
404 | ファイルが見つからない、project が見つからない、または機能が無効 |
/api/projects/{projectId}/files/{fileId}書くファイルをリネーム、または別のフォルダへ移動します。1 項目以上を指定してください。
{
"name": "要件定義(確定版).pdf",
"folderId": null
}
folderId: null はルートへの移動です。成功時は { "file": ProjectFile } を返します。
| status | error | 意味 |
|---|---|---|
200 | — | 更新したファイル |
400 | 入力エラー文 | 変更項目がない、または名前・UUID が不正 |
403 | 権限エラー文 | ファイルを更新する権限がない |
404 | folder_not_found またはエラー文 | ファイルまたは移動先フォルダが見つからない |
409 | file_name_taken | 移動先に同名ファイルがある |
/api/projects/{projectId}/files/{fileId}本人 / adminファイルとすべてのリビジョンを削除します。復元はできません。member は自分がアップロードしたファイルだけを削除できます。
| status | 意味 |
|---|---|
204 | 削除済み。レスポンス body なし |
403 | ファイルを削除する権限がない |
404 | ファイルが見つからない、project が見つからない、または機能が無効 |
ダウンロード
/api/projects/{projectId}/files/{fileId}/download?revision={revision}&redirect=1読む指定リビジョンをダウンロードする presigned URL を発行します。revision を省略すると最新版です。
redirect=1 を省略した場合は、5 分間有効な URL を JSON で返します。
{
"url": "https://storage.example.com/presigned-url",
"expiresAt": "2026-08-31T02:05:00.000Z"
}
redirect=1 の場合は presigned URL へ 302 リダイレクトし、cache-control: private, no-store を付けます。ダウンロード時のファイル名は、最新版では現在のファイル名、旧版ではそのリビジョンのアップロード時 filename です。
| status | error | 意味 |
|---|---|---|
200 | — | { url, expiresAt } |
302 | — | redirect=1 のリダイレクト |
400 | エラー文 | revision が不正 |
403 | 権限エラー文 | project を読む権限がない |
404 | エラー文 | ファイルまたはリビジョンが見つからない |
503 | storage_unavailable | 添付ストレージが設定されていない |
フォルダ
/api/projects/{projectId}/folders書くフォルダを作成します。
{
"name": "設計資料",
"parentId": null
}
成功時は 201 で次の形式を返します。
{
"folder": {
"id": "folder-uuid",
"parentId": null,
"name": "設計資料",
"updatedAt": "2026-08-31T01:23:45.678Z"
}
}
| status | error | 意味 |
|---|---|---|
201 | — | { "folder": ProjectFolder } |
400 | 入力エラー文 | 名前または UUID が不正 |
403 | 権限エラー文 | フォルダを作成する権限がない |
404 | folder_not_found | 親フォルダが見つからない |
409 | folder_name_taken | 同じ場所に同名フォルダがある |
422 | folder_too_deep | 5 階層を超える |
/api/projects/{projectId}/folders/{folderId}書くフォルダをリネーム、または別の親フォルダへ移動します。1 項目以上を指定してください。
{
"name": "設計・仕様",
"parentId": "parent-folder-uuid"
}
parentId: null はルートへの移動です。成功時は { "folder": ProjectFolder } を返します。
| status | error | 意味 |
|---|---|---|
200 | — | 更新したフォルダ |
400 | 入力エラー文 | 変更項目がない、または名前・UUID が不正 |
403 | 権限エラー文 | フォルダを更新する権限がない |
404 | folder_not_found またはエラー文 | 対象または移動先フォルダが見つからない |
409 | folder_name_taken | 移動先に同名フォルダがある |
422 | folder_cycle | 自分自身または子孫の下への移動 |
422 | folder_too_deep | 移動後に 5 階層を超える |
/api/projects/{projectId}/folders/{folderId}adminフォルダを削除します。子フォルダ、ファイル、リビジョンも削除され、復元はできません。
| status | 意味 |
|---|---|
204 | 削除済み。レスポンス body なし |
403 | owner / admin ではない |
404 | フォルダが見つからない、project が見つからない、または機能が無効 |
名前とエラー形式
ファイル名とフォルダ名は 1〜255 文字です。/ を含む名前と、. または .. だけの名前は 400 になります。前後の空白は取り除かれます。
ルートや入力検証で返すエラーは、次の形式です。
{ "error": "名前を入力してください。" }
FilesError に対応するエラーは、機械判定用の error と表示用の message を返します。専用コードがない場合は、両方に同じメッセージが入ります。
{
"error": "folder_name_taken",
"message": "同じ場所に同名のフォルダがあります。"
}
現行実装では、未認証は 401、project の操作権限がない場合は 403 です。形式が不正な UUID、存在しないリソース、ファイル機能が無効な project は 404 で返します。