채팅·파일·프로젝트 조회 및 삭제
채팅·파일·프로젝트 조회 및 삭제
이 페이지는 Compliance API를 통해 claude.ai 조직의 채팅 콘텐츠, 파일 첨부, 프로젝트에 접근하는 방법을 설명해 드릴게요.
이 페이지의 엔드포인트는 Claude Enterprise 조직에서만 사용할 수 있어요. claude.ai 채팅·파일·프로젝트를 조회·삭제하며, Cowork·Claude Code 같은 앱의 세션 기록은 세션 기록 조회에서 다뤄요. Compliance API 설정 참고.
필요한 범위: Compliance Access Key의
read:compliance_user_data. 삭제 엔드포인트는delete:compliance_user_data도 필요해요.전제 조건: 조직 전체 채팅 목록화에는 없음. 채팅 목록을 특정 사용자로 필터링하려면 조직 사용자 목록화의 사용자 ID가 필요해요. 이 페이지의 다른 엔드포인트는 리소스 ID를 직접 받아요.
이 페이지의 엔드포인트는 Claude Enterprise 채팅 콘텐츠, 파일 업로드, 프로젝트, 프로젝트 첨부를 준수 검토자에게 노출해요. eDiscovery(전자 증거 개시) 내보내기, DLP(데이터 손실 방지) 집행, 계정 삭제 응답을 지원해요. 채팅·파일·프로젝트 콘텐츠는 조직의 보존 정책이 허용하는 동안 보존돼요. 사용자가 claude.ai에서 채팅을 삭제하면 메시지 콘텐츠, 첨부 파일, 도구 생성 파일, 아티팩트가 함께 삭제돼요. Compliance API는 여전히 채팅을 나열하며 deleted_at이 채워지고 name이 비워지고, 메시지는 콘텐츠 없이 반환돼요. 하드 삭제된 채팅(Compliance API 자체를 통해, 또는 조직의 보존 기간이 만료된 후)은 조회할 수 없어요.
출처: 문서
본문
두 범위 모두 claude.ai에서 만든 Compliance Access Key(sk-...)에만 부여돼요. 프로비저닝하려면 Compliance API 설정을 참고하세요. read:compliance_user_data 범위는 조회를 다루고, delete:compliance_user_data는 삭제 엔드포인트에만 필요해요. 채팅·파일·프로젝트·첨부 엔드포인트는 Admin API 키(sk-...)에 사용할 수 없어요. Admin API 키로 인증된 호출은 403 Forbidden을 반환해요.
이 페이지의 엔드포인트는 두 가지 방식으로 페이지네이션해요. 전체 참조는 결과 페이지네이션을 참고하세요. 각 섹션은 어떤 방식이 적용되는지 명시해요.
채팅과 메시지 조회
리스트 채팅으로 채팅 메타데이터를 페이지네이션한 뒤, 채팅 메시지 가져오기로 한 채팅의 전체 메시지 콘텐츠를 가져오세요.
채팅 목록 엔드포인트는 기본적으로 조직 전체 범위예요. user_ids[]를 생략하면 상위 조직 아래의 모든 채팅을 포함해요. order_by=updated_at을 추가하면 마지막 업데이트 시간으로 정렬돼요. 이 조합이 채팅을 내보내고 내보내기를 최신으로 유지하는 권장 방식이에요. 하나의 페이지네이트 루프로 사용자를 먼저 열거하지 않고도 모든 사용자의 새 채팅, 새 메시지가 있는 채팅, claude.ai에서 삭제된 채팅을 모두 집어오기 때문이에요. 다음 요청은 특정 날짜 이후 업데이트된 채팅을 나열해요.
curl --fail-with-body -sS -G \
"https://api.anthropic.com/v1/compliance/apps/chats" \
--header "x-api-key: $ANTHROPIC_API_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"
{
"data": [
{
"id": "claude_chat_01H5CWunD7RpVJ5bHa8RCkja",
"name": "Product Requirements Discussion",
"created_at": "2026-04-10T08:09:10Z",
"updated_at": "2026-04-10T09:10:11Z",
"deleted_at": null,
"href": "https://claude.ai/chat/abcdef01-2345-6789-abcd-ef0123456789",
"model": "claude-opus-5-5",
"organization_uuid": "91012d09-e48b-438e-a489-1bebfd8fa6f9",
"project_id": "claude_proj_01KGp4eZNug9ri4kE35RSppq",
"user": {
"id": "user_01XyDMpzjS89pFZXqSFUBDr6",
"email_address": "[email protected]"
}
}
],
"has_more": true,
"first_id": "eyJrIj...LiJ9",
"last_id": "eyJrIj...LiJ9"
}
결과는 order_by 필드를 기준으로 오름차순, 오래된 것부터 정렬되며 동률은 id로 결정돼요. 페이지네이션은 결과 페이지네이션에 설명된 표준 first_id/last_id/has_more 커서 필드를 사용해요. 더 새로운 채팅 쪽으로 앞으로 걸어가려면 다음 요청에 응답의 last_id를 after_id로 전달하세요.
그 정방향 이동이 실행 간에 내보내기를 최신으로 유지하는 방법이기도 해요. 마지막 페이지의 last_id를 영속화하고 다음 실행에서 after_id로 그 지점부터 재개하세요. 목록이 updated_at으로 정렬되므로 채팅이 새 메시지를 받거나, 프로젝트 안팎으로 이동하거나, claude.ai에서 삭제되면 저장된 커서 앞부분에 다시 나타나요. 따라서 증분 실행마다 완전히 새로운 채팅과 그 후 그런 방식 중 하나로 변경된 이전 채팅을 모두 반환해요. 이름 변경 같은 다른 편집은 채팅이 다시 나타나게 보장하지 않아요. 채팅 id를 키로 결과를 멱등적으로 처리해 그 재등장을 다루세요. deleted_at이 채워진 채 돌아온 채팅은 가져올 콘텐츠가 없으므로 업데이트가 아니라 삭제로 취급하세요.
이 조직 전체 조회에는 몇 가지 제약이 적용돼요. 커서는 불투명하고 정렬 키에 바인딩되므로, 한 order_by 값 아래 발급된 after_id는 다른 값 아래에서는 400 오류로 거부돼요. 시간 필터 경계도 정렬 키와 일치해야 해요. updated_at.* 경계는 order_by=updated_at과, created_at.* 경계는 기본 order_by=created_at과 짝지으세요. before_id를 사용한 역방향 페이지네이션은 지원되지 않고 project_ids[] 필터는 사용할 수 없어요. 전체 필터 참조는 리스트 채팅 참고.
대신 목록을 특정 사용자로 범위를 지정하려면(예: 명명된 보관인에 대한 법적 보존) 1~10개의 user_ids[] 값을 전달하세요. ID는 조직 사용자 목록화에서 얻으세요. 사용자 필터 조회는 항상 created_at으로 정렬하며(order_by=updated_at 전달 시 400 오류) after_id와 before_id를 모두 지원해요. project_ids[] 필터는 이 사용자 필터 형식에서만 사용할 수 있어요. user_ids[]를 updated_at.* 경계와 결합하는 것은 더 이상 사용되지 않으며 2026-09-22 이후에는 400 오류로 거부돼요. 보관인 집합을 업데이트 시간으로 최신 상태로 유지하려면 user_ids[] 없이 조직 전체 order_by=updated_at 이동을 실행해 결과에서 보관인의 채팅을 선택하고, 사용자 필터 목록은 created_at 정렬 내보내기에 유지하세요.
curl --fail-with-body -sS -G \
"https://api.anthropic.com/v1/compliance/apps/chats" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--data-urlencode "user_ids[]=user_01XyDMpzjS89pFZXqSFUBDr6" \
--data-urlencode "created_at.gte=2025-06-01T00:00:00Z" \
--data-urlencode "limit=100"
목록 응답은 채팅 메타데이터만 담아요. 실제 채팅 콘텐츠, 첨부 파일, 인라인 아티팩트(Claude가 채팅 안에서 생성하는 구조화된 문서)를 가져오려면 각 채팅 ID에 대해 messages 엔드포인트를 호출하세요:
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_API_KEY" \
--header "anthropic-version: 2023-06-01"
messages 엔드포인트는 채팅의 메타데이터와 created_at으로 정렬된 chat_messages 배열을 반환해요. limit를 생략하면 전체 메시지 집합이 한 응답으로 반환돼요. 매우 긴 채팅은 limit, after_id, before_id를 전달해 페이지네이션하세요. 엔드포인트는 created_at.*·updated_at.* 범위 경계(gt, gte, lt, lte)와 order 매개변수(asc·desc)도 받아요. 전체 매개변수 목록은 채팅 메시지 가져오기 참고. 사용자 메시지의 created_at은 메시지가 보내진 시각이고, 어시스턴트 메시지는 Claude가 메시지를 생성 완료한 시각이에요. 각 메시지는 텍스트 콘텐츠와, 있으면 업로드된 파일(보통 사용자 메시지), 도구 생성 파일, 어시스턴트가 생성·업데이트한 아티팩트(보통 어시스턴트 메시지)를 담아요:
{
"id": "claude_chat_01H5CWunD7RpVJ5bHa8RCkja",
"name": "Product Requirements Discussion",
"created_at": "2026-04-10T08:09:10Z",
"updated_at": "2026-04-10T09:10:11Z",
"deleted_at": null,
"href": "https://claude.ai/chat/abcdef01-2345-6789-abcd-ef0123456789",
"model": "claude-opus-5-5",
"organization_uuid": "91012d09-e48b-438e-a489-1bebfd8fa6f9",
"project_id": "claude_proj_01KGp4eZNug9ri4kE35RSppq",
"user": {
"id": "user_01XyDMpzjS89pFZXqSFUBDr6",
"email_address": "[email protected]"
},
"chat_messages": [
{
"id": "claude_chat_msg_01VnBPkLmtj7YdW5QrXKEA8c",
"role": "user",
"created_at": "2026-04-10T08:09:10Z",
"content": [
{
"type": "text",
"text": "Can you help me draft requirements for our new dashboard feature?"
}
],
"files": [
{
"id": "claude_file_01UaT9wBcDfGhJkLmNpQrSv7",
"filename": "dashboard_mockup_v1.pdf",
"mime_type": "application/pdf",
"size_bytes": 482133,
"md5": "56367e4d2705cc9c025ad07424e944f0",
"created_at": "2026-04-10T08:09:10Z"
}
]
},
{
"id": "claude_chat_msg_01M8tFcHwbQ2kY6NpEjRZv4D",
"role": "assistant",
"created_at": "2026-04-10T08:09:11Z",
"content": [
{
"type": "text",
"text": "I'd be happy to help you draft requirements for your dashboard feature..."
}
],
"generated_files": [
{
"id": "claude_gen_file_01TbR8wAcCeFhJkLnPqStUvX",
"filename": "requirements_summary.csv",
"mime_type": "text/csv",
"size_bytes": 2048,
"md5": "89968669461d95416549937168269d6b"
}
],
"artifacts": [
{
"id": "claude_artifact_01HqRsTuVwXyZa2BcDeFgH4J",
"version_id": "claude_artifact_version_01KmNpQrSt3UvWxYz5AbCdEfG",
"title": "Dashboard Requirements Draft",
"artifact_type": "text/markdown"
}
]
}
],
"has_more": false,
"first_id": "eyJtc2...4ifQ==",
"last_id": "eyJtc2...4ifQ=="
}
files, generated_files, artifacts는 주어진 메시지에서 각각 null일 수 있어요. files는 사용자가 메시지에 첨부한 파일과 텍스트 첨부(PDF, 이미지, 스프레드시트, 문서, 붙여넣은 텍스트 등)로, claude.ai가 저장한 형태예요. generated_files는 어시스턴트가 대화 중 도구 사용으로 만든 이진 파일(예: PDF, 스프레드시트, 슬라이드 데크)이에요. artifacts는 어시스턴트가 응답에서 생성·업데이트한 버전 관리 문서(예: 코드, 마크다운)예요. 아티팩트는 같은 채팅의 여러 어시스턴트 턴에 걸쳐 수정될 수 있고, 각 개정은 같은 아티팩트 id 아래 새 version_id로 나타나요. 각 항목의 id(아티팩트는 version_id)를 파일·아티팩트 조회의 일치하는 콘텐츠 엔드포인트에 전달해 다운로드하세요.
파일·아티팩트 조회
파일과 아티팩트는 독립적으로 나열되지 않고 ID로 다운로드돼요. ID는 채팅·메시지 조회의 채팅 메시지 엔드포인트(각 메시지의 files, generated_files, artifacts 배열) 또는 프로젝트 수준 업로드의 프로젝트 첨부 엔드포인트에서 나와요.
ID 유형과 필요한 데이터에 맞는 엔드포인트를 선택하세요. 동일한 파일 콘텐츠 엔드포인트가 채팅 파일과 프로젝트 파일 모두에 사용돼요.
| 보유 항목 | 원하는 것 | 이 엔드포인트 사용 |
|---|---|---|
claude_file_* ID |
파일의 콘텐츠 | 파일 콘텐츠 다운로드 |
claude_file_* ID |
파일의 메타데이터만 | 파일 메타데이터 가져오기 |
claude_gen_file_* ID |
도구 생성 파일의 이진 콘텐츠 | Claude 생성 파일 다운로드 |
claude_gen_file_* ID |
도구 생성 파일의 메타데이터만 | 생성 파일 메타데이터 가져오기 |
claude_artifact_version_* ID |
한 아티팩트 버전의 텍스트 | 아티팩트 콘텐츠 다운로드 |
claude_artifact_version_* ID |
아티팩트 버전의 메타데이터만 | 아티팩트 메타데이터 가져오기 |
claude_proj_doc_* ID |
프로젝트 문서의 평문 콘텐츠 | 프로젝트 문서 콘텐츠 가져오기 |
claude_proj_doc_* ID |
프로젝트 문서의 메타데이터만 | 프로젝트 문서 메타데이터 가져오기 |
파일 콘텐츠 엔드포인트는 claude.ai가 해당 파일에 대해 저장한 콘텐츠를 청크 이진 응답으로 스트리밍해요. 그 콘텐츠가 사용자가 업로드한 파일과 항상 동일하지는 않아요. 이미지는 업로드된 바이트가 아니라 처리된 사본으로 제공될 수 있어요. 채팅에 첨부된 일부 문서(예: Word 파일, PowerPoint 파일, 일부 PDF)는 claude.ai가 추출한 텍스트로 저장돼요. 이 문서들에 대해 엔드포인트는 원본 파일 이름 아래 추출된 텍스트를 반환하고, 원본 문서는 Compliance API로는 사용할 수 없어요. size_bytes와 md5 필드는 업로드된 파일이 아니라 저장된 콘텐츠를 설명해요. 파일 이름과 mime_type은 여전히 업로드된 문서의 형식을 지칭할 수 있어요. 파일 형식은 이름이나 선언된 유형이 아니라 반환된 바이트로 식별하세요.
응답은 다음 헤더를 담아요:
Content-Disposition: attachment; filename*=utf-8''<percent-encoded filename>은 원본 업로드 파일 이름을 RFC 5987 확장 형식으로 담아요. 확장 형식은 모든 파일 이름에 사용되며, 비ASCII만을 위한 것이 아니에요.Content-Type은 저장된 콘텐츠에 대해 기록된 MIME 유형을 담아요. 추출된 텍스트로 저장된 문서의 경우에도 원본 문서 형식을 지칭할 수 있어요.Content-MD5는 RFC 1864에 지정된 대로 base64 인코딩된 제공 바이트의 MD5 다이제스트를 담아요.Transfer-Encoding: chunked는 항상 설정돼요.
file_id="claude_file_01UaT9wBcDfGhJkLmNpQrSv7"
curl --fail-with-body -sS \
"https://api.anthropic.com/v1/compliance/apps/chats/files/$file_id/content" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--output "dashboard_mockup_v1.pdf"
curl에서 보통 Content-Disposition 파일 이름으로 다운로드를 저장하는 --remote-header-name(-J) 옵션은 filename* 형식을 읽지 못하므로 --output으로 직접 파일 이름을 정하세요. 스크립트에서는 채팅 메시지나 파일 메타데이터 가져오기 응답의 파일 filename 필드에서 이름을 가져오거나 filename*을 디코딩하세요. 어느 쪽이든 사용자가 업로드에 준 이름이므로 출력 경로로 사용하기 전에 신뢰하지 않는 것으로 취급하세요: 기본 이름만 유지하고, 파일 시스템에 안전한 문자만 허용하며, -나 .로 시작하는 이름은 거부하세요.
파일 콘텐츠 엔드포인트와 달리 아티팩트 콘텐츠 엔드포인트는 JSON 객체를 반환해요. 어시스턴트 메시지의 artifacts 배열에 있는 항목 중 하나의 version_id를 전달하세요(안정적인 아티팩트 id가 아니라). 아티팩트의 각 새 버전은 고유한 version_id를 가져요. 응답의 content 필드는 정확히 그 버전의 텍스트를 담고, title과 artifact_type 필드는 아티팩트를 설명해요. 아티팩트 메타데이터 가져오기는 그 텍스트의 UTF-8 인코딩에 대해 size_bytes와 md5를 계산하므로, 전체 응답 본문이 아니라 content 값과 비교하세요.
프로젝트와 첨부 조회
프로젝트는 관련 채팅을 커스텀 지침, 지식 베이스 콘텐츠, 첨부 파일·텍스트 문서와 함께 묶어요. Compliance API는 프로젝트 메타데이터, 프로젝트 세부 사항, 프로젝트에 속한 첨부 목록을 노출해요.
프로젝트 결과는 생성 날짜 오름차순으로 정렬돼요. 첨부 결과는 created_at 오름차순으로 정렬되며 동률은 id로 결정돼요. 프로젝트 목록·첨부 목록 응답은 채팅·Activity Feed가 사용하는 first_id/last_id 커서 대신 불투명한 next_page 페이지 토큰으로 페이지네이션해요. 다음 요청에서 토큰을 page 쿼리 매개변수로 그대로 전달하세요.
프로젝트 파일과 프로젝트 문서
프로젝트 첨부는 두 가지 뚜렷한 형태 중 하나이며, 각 항목의 type 판별자로 식별돼요:
type이 project_file인 항목은 ID가 claude_file_로 시작하는 파일 업로드(PDF, 이미지, 스프레드시트)예요. 파일 콘텐츠 다운로드로 다운로드하세요. type이 project_doc인 항목은 ID가 claude_proj_doc_로 시작하는 평문 문서(항상 text/plain)예요. 프로젝트에 추가될 때 claude.ai가 텍스트로 변환하는 Word 파일 같은 문서를 포함해요. 프로젝트 문서 콘텐츠 가져오기로 가져오세요.
첨부 목록을 걷는 소비자는 type에 따라 분기해 각 항목에 일치하는 콘텐츠 엔드포인트를 호출해야 해요. 다음 요청은 첨부 한 페이지를 나열해요. has_more가 false가 될 때까지 next_page를 page 매개변수로 전달해 페이지네이션하세요.
project_id="claude_proj_01KGp4eZNug9ri4kE35RSppq"
curl --fail-with-body -sS -G \
"https://api.anthropic.com/v1/compliance/apps/projects/$project_id/attachments" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01"
{
"data": [
{
"id": "claude_file_01UaT9wBcDfGhJkLmNpQrSv7",
"created_at": "2026-04-10T08:09:10Z",
"filename": "dashboard_mockup_v1.pdf",
"mime_type": "application/pdf",
"size_bytes": 482133,
"md5": "56367e4d2705cc9c025ad07424e944f0",
"type": "project_file"
},
{
"id": "claude_proj_doc_01YnT8sBcWvUtXzQpMkRfDgH",
"created_at": "2026-04-10T08:09:11Z",
"filename": "requirements.md",
"mime_type": "text/plain",
"type": "project_doc"
}
],
"has_more": false,
"next_page": null
}
콘텐츠 삭제
모든 성공적인 삭제는 영구적이고 즉각적이에요. 복구 창이 없어요.
Compliance API는 채팅, 파일, 프로젝트 문서, 전체 프로젝트에 대한 하드 삭제 엔드포인트를 노출해요. 하드 삭제된 채팅은 복원할 수 없고, 이후 목록 응답에 나타나지 않아요.
- 채팅 삭제: 채팅의 메시지와 그 메시지에 첨부된 파일도 제거해요.
- 파일 삭제: 채팅 파일과 프로젝트 파일을 모두 다뤄요.
- 프로젝트 문서 삭제: ID로 단일 프로젝트 문서를 제거해요.
- 프로젝트 삭제: 프로젝트 삭제 전 채팅 분리 참고.
네 엔드포인트 모두 Compliance Access Key 생성 시 읽기 범위와 별도로 부여되는 delete:compliance_user_data 범위가 필요해요.
다음 요청은 하나의 채팅을 삭제해요. 같은 패턴이 다른 삭제 엔드포인트에도 적용되며 URL만 달라져요.
# WARNING: This operation PERMANENTLY deletes the chat, all of its messages,
# and any attached files. Deletion is immediate and cannot be undone. It
# requires the `delete:compliance_user_data` scope, which is granted separately
# from `read:compliance_user_data` when the Compliance Access Key is created.
# Ensure you have explicit authorization before running this.
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_API_KEY" \
--header "anthropic-version: 2023-06-01"
{
"id": "claude_chat_01H5CWunD7RpVJ5bHa8RCkja",
"type": "claude_chat_deleted"
}
각 성공적인 삭제는 id와 type 판별자를 가진 작은 확인 봉투를 반환해요. 채팅 엔드포인트는 claude_chat_deleted를 반환해요. 삭제를 확인한 것으로 취급하기 전에 type 필드를 확인하세요. 다른 엔드포인트가 반환하는 정확한 type 값은 각 삭제 엔드포인트의 API 참조 페이지를 참고하세요.
프로젝트 삭제 전 채팅 분리
어떤 채팅이라도 프로젝트에 첨부된 채로는 프로젝트를 삭제할 수 없어요. API는 이 본문으로 409를 반환해요:
{
"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."
}
}
해결하려면 GET /v1/compliance/apps/chats?user_ids[]={user_id}&project_ids[]={project_id}로 프로젝트의 채팅을 나열하고(project_ids[] 필터는 user_ids[] 값이 하나 이상 필요해요. 조직 사용자 목록화로 ID를 열거), 각각을 DELETE /v1/compliance/apps/chats/{claude_chat_id}로 삭제하거나(또는 claude.ai에서 프로젝트 밖으로 이동) 프로젝트 삭제를 다시 시도하세요.
다음 단계
- API 참조 — 이동 — 모든 채팅·파일·프로젝트·아티팩트 엔드포인트의 전체 요청·응답 스키마.
- 세션 기록 조회 — 이동 — 사용자가 Cowork·Claude Code 같은 Claude 앱·에이전트에서 실행한 세션을 나열하고 기록을 조회하세요.
- 조직·사용자·역할·그룹·설정 나열 — 이동 — 이 페이지의 채팅·프로젝트와 관련된 사람·팀을 열거하세요.