Compliance APIでチャットを削除する手順 — ファイル・プロジェクトも対象
Compliance APIでclaude.aiのチャット・添付ファイル・プロジェクトを取得し、完全削除する手順です。取り消せない操作なので必要なスコープと事前確認をまとめます。
Compliance APIでできるチャット・ファイル・プロジェクト操作
Compliance APIは、Claude Enterprise組織のclaude.aiチャット・添付ファイル・アーティファクト・プロジェクトを、コンプライアンス担当者向けに読み取り・削除できるエンドポイント群を提供します。eDiscovery(電子証拠開示)のエクスポート、DLP(データ損失防止)の実施、アカウント削除要求への対応が主な用途です。このページのエンドポイントが扱うのはclaude.aiのチャット・ファイル・プロジェクトだけです。CoworkやClaude Codeのセッションのトランスクリプトは別エンドポイント(後述のセッション記事)が担当します。
必要なキーはclaude.aiで作成したCompliance Access Key(sk-ant-api01-...)で、読み取りにはread:compliance_user_dataスコープ、削除にはさらにdelete:compliance_user_dataスコープが要ります。Claude Console側のAdmin API key(sk-ant-admin01-...)ではこのページのエンドポイントを一切呼べず、403 Forbiddenが返ります。Admin API keyが持つスコープはread:compliance_activitiesだけで、read:compliance_user_dataは付与できません。キーの作り方はCompliance APIのセットアップとアクセスキー作成を先に済ませてください。
チャット・ファイル・プロジェクトのコンテンツは、組織の保持ポリシーが許す期間だけ保存されます。「削除」には2種類あり、Compliance APIから見える状態がまったく違います。
同じ「削除」でも残るものが違う
ユーザーがclaude.aiで削除
メッセージ本文・添付ファイル・ツール生成ファイル・アーティファクトは消えます。ただしチャット自体はdeleted_at付き・名前空欄のまま一覧に残り、メッセージも本文なしで返ります。
Compliance APIでハードデリート
取り消せない削除です。保持期間を過ぎたチャットと同じく、一覧からも取得できなくなります。
この違いは、削除の取りこぼし検知や後始末のスクリプトを組むときに効いてきます。
チャットとメッセージを取得する
チャット一覧はList chats、1件のチャット本文はGet chat messagesで取得します。
一覧エンドポイントは既定で組織全体を対象にします。user_ids[]を付けなければ、親組織配下の全チャットが対象です。order_by=updated_atを付けると更新順にソートされ、ユーザーを列挙せずに新規・更新・削除済みのチャットをまとめて拾えるため、継続的なエクスポートに向いています。
curl --fail-with-body -sS -G \
"https://api.anthropic.com/v1/compliance/apps/chats" \
--header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \
--header "anthropic-version: 2023-06-01" \
--data-urlencode "order_by=updated_at" \
--data-urlencode "updated_at.gte=2025-06-01T00:00:00Z" \
--data-urlencode "limit=100"結果はorder_byの値で昇順(古い順)に並び、first_id/last_id/has_moreのカーソルでページ送りします。前回実行時のlast_idをafter_idとして渡せば、次回以降も新規チャットと更新・削除されたチャットの両方を拾えます。IDをキーに冪等に処理し、deleted_atが入っているチャットは「削除済み」として扱ってください。
特定ユーザーに絞る場合はuser_ids[]を1〜10件渡します。ユーザーIDはList organization usersで取得します。ユーザー絞り込みのクエリは常にcreated_at順になり(order_by=updated_atを渡すと400エラー)、before_idも使えます。project_ids[]での絞り込みもこの形式でしか使えません。user_ids[]とupdated_at.*の併用は2026年9月22日より後は400エラーで拒否されます。更新順で対象ユーザーを追い続けたい場合は、組織全体のクエリを実行してから対象ユーザーの分だけ抽出する形に切り替える必要があります。
チャット本文・添付ファイル・アーティファクトは、チャットIDごとにメッセージエンドポイントで取得します。
chat_id="claude_chat_01H5CWunD7RpVJ5bHa8RCkja"
curl --fail-with-body -sS \
"https://api.anthropic.com/v1/compliance/apps/chats/$chat_id/messages" \
--header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \
--header "anthropic-version: 2023-06-01"各メッセージには本文に加えて、ユーザーが添付したfiles、アシスタントがツールで生成したgenerated_files、アシスタントが作成・更新したartifacts(コードやMarkdownのバージョン管理された文書)が入ります。limitを省略すると全メッセージが1回で返り、長いチャットではlimit・after_id・before_idでページ送りします。
ファイルとアーティファクトの中身を取得する
ファイル・生成ファイル・アーティファクトはIDだけで個別にダウンロードします。IDの種類ごとに叩くエンドポイントが変わります。
| 持っているID | 欲しいもの | エンドポイント |
|---|---|---|
claude_file_* | 欲しいものファイル本文 | エンドポイントDownload file content |
claude_gen_file_* | 欲しいものツール生成ファイルの本文 | エンドポイントDownload a Claude-generated file |
claude_artifact_version_* | 欲しいものアーティファクト1バージョンの本文 | エンドポイントDownload artifact content |
claude_proj_doc_* | 欲しいものプロジェクトドキュメントの本文 | エンドポイントGet project document content |
file_id="claude_file_01UaT9wBcDfGhJkLmNpQrSv7"
curl --fail-with-body -sS \
--header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \
--header "anthropic-version: 2023-06-01" \
--output "dashboard_mockup_v1.pdf" \
"https://api.anthropic.com/v1/compliance/apps/chats/files/$file_id/content"curlの-JはContent-Dispositionのfilename*形式を読まないため、--outputで保存名を自分で指定します。名前はメッセージのfilenameフィールドかfilename*から取ります。アップロード者が付けた名前なので信用せず、ベース名だけを使い、-や.で始まる名前は拒否してください。返ってくる内容は、必ずしもアップロードされたバイト列そのものではありません。画像は加工済みコピーとして配信されることがあり、Wordファイル・PowerPointファイル・一部のPDFはclaude.aiが抽出したテキストとして保存されているため、抽出後のテキストが元のファイル名のまま返ります。ファイル形式は名前や宣言されたMIMEタイプではなく、返ってきたバイト列そのものから判定してください。
アーティファクトのダウンロードには、安定したidではなくversion_idを渡します。アシスタントが同じアーティファクトを会話中に何度も改訂すると、改訂のたびに新しいversion_idが発行され、Compliance APIはその版の内容をそのまま返します。
プロジェクトと添付を取得する
プロジェクトは、カスタム指示・ナレッジベース・添付ファイルをまとめる単位です。List projectsとList project attachmentsで一覧を取得します。プロジェクト一覧・添付一覧はfirst_id/last_id方式ではなく、レスポンスのnext_pageトークンをpageクエリに渡してページ送りする点がチャット一覧と異なります。
プロジェクトの添付はtypeが2種類あり、扱いが分かれます。
project_file: PDFや画像などのファイルアップロード。IDはclaude_file_始まりで、ファイルの取得と同じエンドポイントを使うproject_doc: 常にtext/plainのプレーンテキスト文書。IDはclaude_proj_doc_始まりで、Wordファイルなどプロジェクト追加時にテキスト変換された文書も含む
一覧を歩くコンシューマーは、このtypeで分岐して対応するエンドポイントを呼び分ける必要があります。
コンテンツを削除する
削除エンドポイントは4種類あります。
- Delete chat: チャットとそのメッセージ、添付ファイルもまとめて削除
- Delete file: チャットファイル・プロジェクトファイルの両方に使える
- Delete project document: プロジェクトドキュメントを1件削除
- Delete project: チャットが1件でも紐づいたプロジェクトは削除できない(後述)
4つすべてがdelete:compliance_user_dataスコープを必要とし、このスコープは読み取り用のread:compliance_user_dataとは別にキー作成時に選ぶ必要があります。
# 警告: このコマンドはチャットとそのメッセージ・添付ファイルを完全に削除します。
# 削除は即座かつ取り消し不可能です。delete:compliance_user_data スコープが必要です。
# 実行前に明示的な権限があることを確認してください。
chat_id="claude_chat_01H5CWunD7RpVJ5bHa8RCkja"
curl --fail-with-body -sS -X DELETE \
"https://api.anthropic.com/v1/compliance/apps/chats/$chat_id" \
--header "x-api-key: $ANTHROPIC_COMPLIANCE_ACCESS_KEY" \
--header "anthropic-version: 2023-06-01"成功時はidとtypeを含む小さな確認レスポンスが返ります。チャット削除ならtypeがclaude_chat_deletedです。他の削除エンドポイントもそれぞれ固有のtype値を返すため、削除が確定したかどうかはこのtypeフィールドで判定します。
削除が失敗したとき・すでに消えていたとき
削除の呼び出しで返りうる代表的な応答を、本文メッセージ込みでまとめます。判定にはHTTPステータスとerror.typeを主に使います。404だけはerror.typeが同じなので、本文がNot foundのみか、リソース名を含むかで見分けます。
| 状況 | ステータス / error.type | メッセージ(抜粋) | 対処 |
|---|---|---|---|
| 削除スコープのないキー | ステータス / error.type403 / permission_error | メッセージ(抜粋)Missing required scopes. Got: ['read:compliance_user_data'] Needed: ['delete:compliance_user_data'] | 対処delete:compliance_user_dataを付けたキーを作り直す(スコープは作成後に変えられない) |
| チャットIDが存在しない | ステータス / error.type404 / not_found_error | メッセージ(抜粋)Chat conversation not found: 'claude_chat_...' | 対処すでにハードデリート済みか保持ポリシーで消えている。キューから外す |
| ファイルIDが存在しない | ステータス / error.type404 / not_found_error | メッセージ(抜粋)File not found: <UUID> | 対処メッセージはclaude_file_形式ではなく内部のUUIDで返る。対象はチャット添付・プロジェクトファイルの両方で、claude.aiでチャットごと消されたときも添付ファイルは同じ404になる |
| 認証に失敗 | ステータス / error.type404 / not_found_error | メッセージ(抜粋)Not found | 対処キーの種類を確認する。sk-ant-api03-の通常のClaude API keyは受け付けられない |
最後の行は紛らわしい点です。メッセージがNot foundだけの404は、リソースが無いのではなく認証が通っていない合図で、パスが存在しない場合も同じ本文が返ります。
ユーザーがclaude.aiで消したチャットは404になりません。読み取りは通り、deleted_atが入って本文が空の状態で返ります。ファイルを巻き込んで消えた場合の確認先は、Activity Feedのclaude_chat_deletedです。チャットと一緒に消えたファイルにはclaude_file_deletedが記録されないため、ファイルの活動記録だけを探すと見落とします。
Compliance APIへのリクエストは、親組織あたり毎分600回に制限されます。削除をループで回す後始末スクリプトでは、429が返ったら間隔を空けて再試行する作りにします。
プロジェクト削除前にチャットを切り離す
チャットが1件でも紐づいたプロジェクトは削除できず、409 Conflictが返ります。error.typeは400と同じinvalid_request_errorなので、競合の判別にはステータスコードを使います。
{
"error": {
"type": "invalid_request_error",
"message": "The \"claude_proj_01KGp4eZNug9ri4kE35RSppq\" project cannot be deleted as it has chats attached to it. Delete or detach all chats, and try deleting the project again."
}
}プロジェクトを消せるようにする流れ
- 1
チャットを一覧する
user_ids[]とproject_ids[]を付けて、そのプロジェクトのチャットを取得します。project_ids[]の絞り込みにはuser_ids[]が最低1件必要で、ユーザーIDはList organization usersで引きます。 - 2
チャットを外す
各チャットをDelete chatで個別に削除するか、claude.ai側でプロジェクトから移します。
- 3
プロジェクトを削除する
紐づきがなくなってからDelete projectをやり直します。
まとめ
Compliance APIのチャット・ファイル・プロジェクトエンドポイントは、Compliance Access Keyのread:compliance_user_dataで読み取り、delete:compliance_user_dataで削除します。一覧はorder_by=updated_atの組織全体クエリが継続的なエクスポートの基本形で、本文・ファイル・アーティファクトはIDごとに別エンドポイントで取り出します。削除はすべて即座かつ不可逆なので、実行前の対象確認とスコープを分けたキー運用が欠かせません。
キーのスコープ設計はCompliance APIのセットアップとアクセスキー作成、CoworkやClaude Codeのセッショントランスクリプトの取得はCompliance APIでローカル/リモートのセッション文字起こしを取得するにまとめています。組織全体のデータをまとめて落としたい場合は、Primary Owner向けのClaude組織データエクスポートの手順も選択肢になります。