세션 기록 조회
세션 기록 조회
이 페이지는 사용자가 Claude 앱·에이전트(현재: Cowork, Claude Code, Claude Science, Claude for Microsoft 365, Chrome의 Claude)에서 실행하는 세션을 나열하고 Compliance API를 통해 기록을 조회하는 방법을 설명해 드릴게요.
이 페이지의 엔드포인트는 Claude Enterprise 조직에서만 사용할 수 있어요. 로컬·원격 세션 엔드포인트는 Cowork·Claude Code 세션에 대해 안정적이에요. Claude Science, Claude for Microsoft 365, Chrome의 Claude 세션 커버리지는 베타예요. 엔드포인트는 채팅·파일·프로젝트 엔드포인트와 같은 Compliance Access Key와
read:compliance_user_data범위로 작동해요. 새 키·범위·설정·클라이언트 업데이트가 필요 없어요. Compliance API 설정 참고.
필요한 범위: Compliance Access Key의
read:compliance_user_data.전제 조건: 조직 전체 세션 목록화에는 없음. 원격 세션 목록(클라우드 세션)을 특정 사용자로 필터링하려면 조직 사용자 목록화의 사용자 ID가 필요해요. 로컬 세션 목록은 사용자 필터가 없어요.
이 페이지의 엔드포인트는 Claude Enterprise 조직에서 사용자가 Claude 앱·에이전트로 실행하는 세션의 기록을 준수 검토자에게 노출해요. 각 세션은 Claude와의 단일 대화이며, 기록은 그 대화에서의 사용자 프롬프트·어시스턴트 응답·도구 호출·결과의 시퀀스예요. 엔드포인트는 eDiscovery(전자 증거 개시) 내보내기와 DLP(데이터 손실 방지) 집행을 지원해요.
Compliance API는 세션을 실행 위치에 따라 두 엔드포인트 패밀리로 묶어요. 로컬 세션 엔드포인트는 사용자 기기의 세션, 원격 세션 엔드포인트는 Anthropic 관리 환경의 클라우드에서 실행되는 세션. 두 패밀리 모두 읽기 전용이며 Admin API 키(sk-...)에는 사용할 수 없어요. Admin API 키로 인증된 호출은 403 Forbidden을 반환해요.
다음 표는 각 제품과 실행 위치를 해당 세션을 반환하는 엔드포인트 패밀리와, 응답에서 식별하는 product_surface 값에 매핑해요. 커버리지가 확장되면 표에 제품이 추가돼요.
| 제품 및 실행 위치 | 엔드포인트 패밀리 | product_surface |
|---|---|---|
| 사용자 기기에서 실행되는 Claude Desktop의 Cowork | 로컬 세션 엔드포인트(/v1/compliance/apps/sessions/local) |
cowork |
| 사용자 기기에서 실행되는 터미널·Claude Desktop·IDE 확장의 Claude Code | 로컬 세션 엔드포인트 | claude_code |
| 사용자 기기에서 실행되는 Claude Science 데스크톱 앱 | 로컬 세션 엔드포인트 | claude_science |
| Microsoft 365 데스크톱·웹 앱에서 실행되는 Claude for Microsoft 365(Excel·PowerPoint·Word·Outlook용 Claude 애드인) | 로컬 세션 엔드포인트 | office_agents/excel, office_agents/powerpoint, office_agents/word, office_agents/outlook(앱이 식별되지 않으면 office_agents) |
| 사용자 기기에서 실행되는 Chrome의 Claude(브라우저 확장의 내장 채팅) | 로컬 세션 엔드포인트 | claude_in_chrome |
| claude.ai 웹·모바일에서 시작되어 Anthropic 관리 환경의 클라우드에서 실행되는 Cowork 세션 | 원격 세션 엔드포인트(/v1/compliance/apps/sessions/remote) |
cowork_remote |
로컬 세션 캡처는 조직에 Compliance API가 활성화되어 있어야 하고 사용자가 Claude Enterprise 계정으로 로그인한 동안 적용돼요. 세션 엔드포인트는 다음을 반환하지 않아요:
- Claude Console API 키로 인증된, 또는 Amazon Bedrock·Google Cloud·Microsoft Foundry 같은 타사 클라우드 플랫폼을 통해 실행된 Claude Code 세션.
- 사용자 기기 대신 클라우드 인프라에서 실행되는 Claude Code 클라우드 세션. 이 클라우드 세션들은 둘 다 클라우드에서 실행되지만 원격 세션이 아니에요. 원격 세션 엔드포인트는 Cowork 세션만 반환해요.
- HIPAA 대응이 활성화된 조직의 로컬 세션. 로컬 세션 데이터가 캡처되지 않으므로 로컬 세션 엔드포인트는 그 조직에 대해 세션을 반환하지 않아요.
- 제로 데이터 보존(ZDR)이 적용 중인 로컬 세션. 이 세션은 목록 결과에서 제외되고 조회·messages 엔드포인트는 404를 반환해요.
Anthropic은 세션 콘텐츠를 조회할 때 Compliance API를 권장해요. 다음 표는 로컬 세션·원격 세션을 Cowork·Claude Code에 사용할 수 있는 OpenTelemetry 기반 대안인 Cowork의 OpenTelemetry 로깅과 Claude Code 모니터링과 비교해요.
| 로컬 세션(사용자 기기) | 원격 세션(클라우드) | OpenTelemetry 로깅 | |
|---|---|---|---|
| 전달 | 풀(Pull): HTTPS로 조회·내보내기 | 풀(Pull): HTTPS로 조회·내보내기 | 푸시(Push): OTLP 수집기로 스트리밍 |
| 설정 | 기존 Compliance Access Key로 작동 | 기존 Compliance Access Key로 작동 | 관리자가 OTLP 엔드포인트와 콘텐츠 캡처 설정 구성 |
| 인프라 | Anthropic 호스팅 | Anthropic 호스팅 | 사용자가 수집기·저장소를 운영 |
| ID 접두사 | clls_ |
cse_ |
N/A |
product_surface 값 |
cowork, claude_code, claude_science, claude_in_chrome, office_agents로 시작하는 값 |
cowork_remote |
N/A |
| 보존 | 기본 6년, 또는 유한 커스텀 대화 보존 기간을 설정한 조직은 그 기간; Anthropic이 보관 | 6년(사용자가 세션을 더 일찍 삭제하지 않는 한); Anthropic이 보관 | 사용자 인프라, 사용자 정책 |
| 사용자 프롬프트·어시스턴트 응답 | 예 | 예 | 예, 콘텐츠 캡처 설정 적용 |
| 도구 입력 | 입력당 기본 10,000바이트로 잘림; 요청 시 최대 약 1MiB | 입력당 기본 10,000바이트로 잘림; 요청 시 최대 약 1MiB | 잘린 요약 |
| 도구 결과 콘텐츠 | 각 텍스트 항목 기본 10,000바이트로 잘림; 요청 시 최대 약 1MiB | 각 텍스트 항목 기본 10,000바이트로 잘림; 요청 시 최대 약 1MiB | 크기·성공 같은 메타데이터; Claude Code는 선택적 크기 제한 설정으로 콘텐츠도 캡처 가능 |
| 파일 콘텐츠 | 예, 기록 도구 호출을 통해(텍스트만; 다른 콘텐츠는 자리 표시자로 표시) | 예, 기록 도구 호출을 통해(텍스트만; 다른 콘텐츠는 생략) | 파일 경로; Claude Code는 선택적 크기 제한 설정으로 콘텐츠도 캡처 가능 |
| 호스트·기기 메타데이터(터미널 유형, 워크스페이스 경로) | 아니요 | 아니요 | 예 |
| 토큰 사용·비용 | 아니요; Claude Enterprise Analytics API로 사용 가능 | 아니요; Claude Enterprise Analytics API로 사용 가능 | 예 |
출처: 문서
본문
사용자 기기의 세션 (로컬 세션)
로컬 세션은 사용자가 Claude Enterprise 계정으로 로그인한 동안 사용자 기기에서 실행돼요. 현재: Claude Desktop의 Cowork, Claude Code(터미널·Claude Desktop·IDE 확장), Claude Science 데스크톱 앱, Claude for Microsoft 365(Excel·PowerPoint·Word·Outlook), Chrome 브라우저 확장의 Claude.
Compliance API는 세 개의 엔드포인트로 로컬 세션을 노출해요. GET /v1/compliance/apps/sessions/local은 세션 메타데이터를 나열하고, GET /v1/compliance/apps/sessions/local/{session_id}는 한 세션의 메타데이터를 조회하고, GET /v1/compliance/apps/sessions/local/{session_id}/messages는 한 세션의 기록을 반환해요. 세 개 모두 read:compliance_user_data 범위가 필요하고 공유 Compliance API 요금 한도에만 계산돼요. 원격 세션 엔드포인트에 적용되는 두 번째 요청 예산에는 적용되지 않아요. 429 Too Many Requests 참고. 로컬 세션이 상위 조직에 사용 불가하면 세 엔드포인트 모두 Local sessions are not available. 메시지로 404를 반환해요(로컬 세션을 찾을 수 없음 참고). 세션 목록이나 캡처된 콘텐츠가 일시적으로 사용 불가하면 503을 반환해요(로컬 세션 일시적 사용 불가 참고).
로컬 세션의 경우 Anthropic은 요청이 Claude API에 도달할 때 각 대화를 서버 측에 기록해요. 기기에는 아무것도 설치되지 않고 클라이언트가 이미 Claude API에 보내는 요청 너머의 것은 수집되지 않아요. 로컬 세션 기록은 Claude에게 무엇을 하라고 했는지와 그것이 반환한 것을 보여주며, 기기에서 무슨 일이 벌어졌는지는 아니에요. 파일·네트워크 활동은 기록의 도구 호출·도구 결과를 통해서만 보이므로, API에 도달하지 않는 활동(예: 세션이 보내지 않은 로컬 파일)은 캡처되지 않아요.
고객 관리 암호화 키를 사용하는 조직에서 로컬 세션 기록은 고객 관리 키 아래에서 암호화되고 평소대로 반환돼요. 그 키를 사용할 수 없는 동안(예: 비활성화·철회했거나 도달할 수 없을 때) messages 엔드포인트는 해당 페이지에 대해 기록 콘텐츠 대신 503 Service Unavailable을 반환해요. 그 메시지는 결코 not_captured로 보고되지 않아요(로컬 세션 기록 조회 참고). 세션 목록과 세션 메타데이터 조회는 영향을 받지 않아요.
목록 엔드포인트는 키가 읽을 수 있는 모든 연결 조직의 세션 메타데이터를 기록 콘텐츠 없이 반환해요. 원격 세션 목록과 달리 조직·사용자 필터가 없어요. created_at.gte와 created_at.lt 매개변수로 결과를 시간에 따라 경계지으세요. 둘 다 필수 UTC 오프셋이 있는 RFC 3339 타임스탬프를 받고, 둘 다 제공되면 created_at.lt는 created_at.gte보다 엄격히 이후여야 하며 그렇지 않으면 요청이 400 Bad Request를 반환해요. 세 번째 시간 필터 updated_at.gte는 첫 활동이 아니라 마지막 활동으로 경계를 지어요. 마지막 추론 호출이 주어진 시간 이상인 세션을 반환하며 created_at 필터와 결합해도 정렬·페이지네이션은 바뀌지 않아요. 이 섹션 뒷부분에서 설명하듯 이전 패스 이후 활성인 세션을 폴링하는 데 사용하세요. 새 세션·메시지는 짧은 처리 지연 후(보통 몇 분 이내) 결과에 나타나요. 시작 직후 없다고 해서 캡처되지 않은 것은 아니에요. 다음 요청은 특정 날짜 이후 만들어진 세션을 나열해요.
curl --fail-with-body -sS -G \
"https://api.anthropic.com/v1/compliance/apps/sessions/local" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--data-urlencode "created_at.gte=2026-07-01T00:00:00Z" \
--data-urlencode "limit=100"
{
"data": [
{
"type": "compliance_local_session",
"id": "clls_01HxKpLmNoPqRsTuVwXyZaBc",
"organization_uuid": "9a1e0000-0000-0000-0000-000000000000",
"workspace_id": "wrkspc_01SvYKoWVRVHoEbwESNvzYdR",
"user": {
"id": "user_01GpKpLmNoPqRsTuVwXyZaBc",
"email_address": "[email protected]"
},
"product_surface": "cowork",
"created_at": "2026-07-09T14:02:11Z",
"updated_at": "2026-07-09T14:02:38Z"
},
{
"type": "compliance_local_session",
"id": "clls_01HyLqMnOpQrStUvWxYzAbCd",
"organization_uuid": "9a1e0000-0000-0000-0000-000000000000",
"workspace_id": null,
"user": {
"id": "user_01HqRsTuVwXyZaBcDeFgHiJk",
"email_address": null
},
"product_surface": "claude_code",
"created_at": "2026-07-08T09:15:43Z",
"updated_at": "2026-07-08T09:52:10Z"
}
],
"next_page": "page_AAEfQx7mPdLkq9Rt2VwHbZk"
}
결과는 created_at 역시간순(최신순)으로 정렬되고 동률은 고정된 서버 측 순서로 결정되며 응답당 limit 결과로 제한돼요(기본 100, 최대 500). 엔드포인트는 page·next_page 토큰으로만 앞으로 페이지네이션해요(결과 페이지네이션 참고). 다음 요청의 page 쿼리 매개변수로 응답의 next_page 값을 전달하고 next_page가 null일 때 멈추세요. 응답에는 has_more 필드가 없어요. 목록 순회를 시작한 후 24시간 안에 완료하세요. 이전 목록 커서는 여전히 허용되지만 현재 보존 경계에 맞춰 재평가되므로, 가장 오래된 보존 활동이 곧 보존 기간에서 빠져나가려는 세션은 건너뛸 수 있어요.
각 세션 객체에서 user.id는 항상 설정되고 계정 삭제를 견뎌요. user.email_address는 사용자 계정이 삭제되었거나 사용자가 키가 읽을 수 있는 조직의 구성원이 아닐 때 null이에요. workspace_id는 세션이 워크스페이스와 연결되지 않았을 때 null이에요. 로컬 세션은 하나의 클라이언트 세션 ID에 해당해요. 클라이언트에서 새 대화를 시작하거나 컨텍스트를 지우면 새 세션 기록이 시작돼요. Claude Science의 경우 목록에 앱 자체의 백그라운드 작업(예: 대화 이름 짓기, 최신 앱 버전에서는 검토·위임 트랙)에 대한 별도 세션도 포함될 수 있고, 구버전 앱에서는 그 백그라운드 작업 중 일부가 대화 자체 기록 안의 추가 메시지로 나타나요. 일부 앱 업데이트를 거치며 계속되는 Claude Science 대화는 두 세션으로 나타나요. 이러한 동작은 예상된 것이에요. id 값을 불투명 문자열로 취급하세요. 형식은 예고 없이 바뀔 수 있어요.
Claude for Microsoft 365의 경우 애드인에서 대화를 삭제하는 것은 클라이언트에서만 발생하므로 API에 반영되지 않아요. 로컬 세션에는 deleted_at 필드가 없고, 세션은 보존이 제거할 때까지 나열된 채로 남아 있어요.
로컬 세션은 updated_at은 있지만 status는 없어요. 로컬 세션은 서버 측 수명 주기 상태가 없고 가시성은 보존이 좌우해요. 로컬 세션은 클라이언트가 세션 동안 만드는 Claude API 호출(추론 호출)의 시퀀스로 캡처되고 보존은 각 캡처된 호출에 개별적으로 적용돼요. created_at은 세션의 가장 오래된 보존 호출의 타임스탬프이고 updated_at은 마지막 호출의 타임스탬프이며 둘 다 UTC예요. 더 오래된 호출이 보존 기간을 지나면 created_at이 그에 따라 전진하고, 세션의 모든 호출이 지나가면 세션이 더 이상 반환되지 않아요. updated_at은 가장 최근 호출을 추적하며 그때까지 영향을 받지 않아요. created_at은 실행 사이에 움직일 수 있으므로 시간이 지나며 목록을 다시 걸을 때 id로 중복 제거하세요. 세션이 메시지를 얻으며 기록을 최신으로 유지하려면 updated_at.gte 필터로 폴링하고 연속 창을 겹치게 하세요. 목록 엔드포인트에서 updated_at은 하한이에요. 페이지나 created_at.lt 창 경계에서 아직 활성인 세션의 경우 잠시 세션의 실제 마지막 활동보다 뒤처질 수 있고, 새 호출은 앞서 언급한 짧은 처리 지연 후에만 조회 가능해져요. 그 지연 때문에 각 실행의 updated_at.gte를 이전 실행 시작 시간의 정확한 시각이 아니라 몇 분 전으로 설정하세요. 정확한 이전 시각으로 설정한 경계는 그 순간에 마지막 호출이 여전히 색인되고 있던 세션을 조용히 영구히 버려요. 경계가 그 호출을 지나 진행되면 이후 실행이 반환하지 않기 때문이에요. 반환된 세션을 id로 중복 제거하고 기록을 다시 가져오며 메시지를 id로 중복 제거하세요. 세션 또는 메시지 조회는 항상 정확한 최신 보존 호출을 반영하므로, 더 오래된 창에 대한 주기적 조정 패스는 겹침을 넓히는 것보다 더 철저한 대안이에요.
목록은 세션 활동 메타데이터로 만들어지므로 기록 콘텐츠가 캡처되지 않은 세션(예: 조직에서 캡처가 시작되기 전에 실행된 세션, 보존 기간이 허용하는 만큼 거슬러)을 포함할 수 있어요. 그런 세션의 기록은 각 메시지를 콘텐츠가 사용 불가로 표시된 채 반환해요(로컬 세션 기록 조회 참고).
캡처된 로컬 세션 콘텐츠는 기본적으로 캡처 시점부터 6년 동안 저장돼요. 세션을 실행한 조직이 claude.ai > Organization settings > Data and privacy에서 유한 커스텀 대화 보존 기간을 설정했다면 그 기간이 기본값보다 짧든 길든 적용돼요. 조직에 커스텀 보존 기간이 여러 개 구성되어 있으면 가장 짧은 것이 적용돼요. 그 설정의 변경은 두 가지 방식으로 적용돼요. 설정이 바뀌는 즉시 엔드포인트는 조직의 현재 기간보다 오래된 활동 반환을 멈추는 반면, 각 캡처된 메시지는 캡처될 당시의 기간 동안 저장되므로 나중에 기간을 늘려도 이미 만료된 콘텐츠는 복원되지 않아요.
한 세션의 메타데이터를 직접 가져오려면 ID를 GET /v1/compliance/apps/sessions/local/{session_id}에 전달하세요. 응답은 목록 엔드포인트가 반환하는 것과 같은 세션 객체로, 봉투도 기록 콘텐츠도 없어요. 잘못된 세션 ID는 400 Bad Request를 반환해요. 단일 404 Not Found가 응답이 구분하지 않는 네 가지 경우를 다뤄요: 세션이 키가 읽을 수 있는 조직에 없거나(다른 상위 조직 아래 포함), 존재하지 않거나, 제로 데이터 보존이 적용 중이거나, 모든 호출이 보존을 지났거나.
product_surface(string 또는 null)는 세션을 만든 제품을 식별해요: cowork(사용자 기기의 Claude Desktop Cowork), claude_code(Claude Code), claude_science(Claude Science), claude_in_chrome(Chrome 브라우저 확장의 Claude 내장 채팅), 또는 office_agents/excel·office_agents/powerpoint·office_agents/word·office_agents/outlook 중 하나(앱별 Claude for Microsoft 365; 앱이 식별되지 않으면 단독 office_agents). 커버리지가 확장됨에 따라 새 값이 나타나요.
정방향 호환 핸들러를 만드세요. 인식하지 못하는
product_surface값은 그대로 통과시키고 핸들러가 예상하지 못한 필드는 무시해서, 새 제품 표면이 출시돼도 통합이 계속 작동하게 하세요.
로컬 세션 기록 조회
messages 엔드포인트는 캡처된 Claude API 호출에서 재구성된 세션 기록을 반환해요. 사용자 프롬프트, 어시스턴트 텍스트, 도구 호출, 도구 결과의 텍스트 부분을 모두 크기 잘림만 제외하고 보낸 그대로 반환해요. 그 콘텐츠의 URL·자격 증명·개인 데이터를 마스킹하는 것은 없으므로 기록을 민감하게 취급하세요. 기록은 다음을 생략하거나 대체해요:
- Thinking 블록은 절대 포함되지 않아요.
- 요청의 시스템 프롬프트는 절대 반환되지 않아요.
[system prompt content not shown]메시지 마커가 대신해요(보통 세션당 한 번; 캡처된 콘텐츠가 없는 세션에는 마커가 없어요). - 도구 정의와 MCP 서버 구성은 기록의 일부가 아니에요.
- 이미지·PDF·기타 이진·구조화 블록은 반환되지 않아요. 각각
truncated가true로 설정된[<block type> content not shown](예:[image content not shown])를 읽는text블록으로 나타나요. 도구 결과 안의 웹 검색 결과나 코드 실행 도구의 출력 같은 비텍스트 항목은 하나의[N non-text item(s) not shown]항목으로 교체되고 도구 결과 블록의truncated는true예요. 검색 쿼리나 코드를input에 담은 일치하는 도구 호출은 여전히 반환돼요. text블록의 인용 메타데이터(예: 웹 검색 결과에 의존하는 답변의 출처 인용)는 생략돼요. 텍스트 자체는 반환되고 블록은truncated가true로 설정돼요.
CLAUDE.md 같은 프로젝트 지침 파일은 일반 사용자 역할 콘텐츠로 나타나요. 스킬 콘텐츠는 클라이언트가 메시지 콘텐츠로 보낼 때 나타나며 다른 사용자 텍스트와 구분되지 않아요. 커버리지 요약은 Compliance API FAQ를, 로컬 세션을 원격 세션·OpenTelemetry 로깅과 비교한 표는 이 페이지의 소개를 참고하세요.
session_id="clls_01HxKpLmNoPqRsTuVwXyZaBc"
curl --fail-with-body -sS \
"https://api.anthropic.com/v1/compliance/apps/sessions/local/$session_id/messages" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01"
{
"session": {
"type": "compliance_local_session",
"id": "clls_01HxKpLmNoPqRsTuVwXyZaBc",
"organization_uuid": "9a1e0000-0000-0000-0000-000000000000",
"workspace_id": "wrkspc_01SvYKoWVRVHoEbwESNvzYdR",
"user": {
"id": "user_01GpKpLmNoPqRsTuVwXyZaBc",
"email_address": null
},
"product_surface": "cowork",
"created_at": "2026-07-09T14:02:11Z",
"updated_at": "2026-07-09T14:02:38Z"
},
"data": [
{
"type": "compliance_local_session_message",
"id": "clsm_01J4KpLmNoPqRsTuVwXyZaBa",
"role": "user",
"model": null,
"created_at": "2026-07-09T14:02:11Z",
"provenance": {
"type": "synthetic_marker"
},
"content": [
{
"type": "text",
"text": "[system prompt content not shown]",
"truncated": true
}
]
},
{
"type": "compliance_local_session_message",
"id": "clsm_01J4KpLmNoPqRsTuVwXyZaBc",
"role": "user",
"model": null,
"created_at": "2026-07-09T14:02:11Z",
"provenance": null,
"content": [
{
"type": "text",
"text": "Fix the failing test in tests/auth_test.py",
"truncated": false
}
]
},
{
"type": "compliance_local_session_message",
"id": "clsm_01J4KpLmNoPqRsTuVwXyZaBd",
"role": "assistant",
"model": "claude-opus-5-5",
"created_at": "2026-07-09T14:02:11Z",
"provenance": null,
"content": [
{
"type": "text",
"text": "I'll read the test file first.",
"truncated": false
},
{
"type": "tool_use",
"id": "toolu_01AbCdEfGhIjKlMnOpQrSt",
"name": "Read",
"input": "{\"file_path\":\"tests/auth_test.py\"}",
"truncated": false
}
]
},
{
"type": "compliance_local_session_message",
"id": "clsm_01J4KpLmNoPqRsTuVwXyZaBe",
"role": "user",
"model": null,
"created_at": "2026-07-09T14:02:38Z",
"provenance": null,
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01AbCdEfGhIjKlMnOpQrSt",
"name": "Read",
"is_error": false,
"content": [
{
"type": "text",
"text": "def test_login_expiry():\n ..."
}
],
"truncated": false
}
]
},
{
"type": "compliance_local_session_message",
"id": "clsm_01J4KpLmNoPqRsTuVwXyZaBf",
"role": "assistant",
"model": "claude-opus-5-5",
"created_at": "2026-07-09T14:02:38Z",
"provenance": null,
"content": [
{
"type": "text",
"text": "The test was asserting on a stale expiry timestamp. I've updated it.",
"truncated": false
}
]
}
],
"next_page": null
}
응답은 페이지네이트된 data 배열 옆에 session 봉투를 포함해요. 이 예시의 첫 기록은 요청의 시스템 프롬프트를 대신하는 마커이며 그 provenance는 이 섹션 뒷부분에서 설명해요. 이 엔드포인트에서 user.email_address는 항상 null이에요. messages 엔드포인트는 이메일 주소를 해석하지 않으므로 여기서 null이 사용자 계정이 삭제됐다는 뜻은 아니에요. 세션을 이메일 주소에 귀속시키려면 user.id를 목록 엔드포인트나 조회 엔드포인트(GET /v1/compliance/apps/sessions/local/{session_id})에 조인하세요.
메시지는 기본적으로 오래된 것부터 반환돼요. order=desc를 전달하면 뒤집혀요. 페이지네이션은 목록 엔드포인트와 같은 page/next_page 방식을 사용하며 limit 기본값 100, 최대 1,000이에요. 응답이 크기 한도에 도달하면 페이지가 일찍 끝날 수 있으므로 limit보다 적은 메시지 페이지가 끝을 의미하지는 않아요. next_page가 null이 될 때까지 계속 페이지네이션하세요. 페이지 커서는 발급된 세션·정렬 순서에 바인딩되고, 순회의 커서는 첫 페이지 후 24시간에 만료돼요. 만료된 커서는 page 매개변수 없이 다시 시작하라고 알려주는 400 Bad Request를 반환하고, 다시 시작된 순회는 현재 보존 경계를 반영해요. 다른 세션이나 order로 발급된 커서도 잘못된 커서로 400을 반환해요.
각 메시지는 role(user 또는 assistant)과 text·tool_use·tool_result 블록의 content 배열을 담아요. 또한 model을 담아요. Claude API에서 캡처된 어시스턴트 턴에서는 그 턴을 서빙한 모델이고, 사용자 메시지와 provenance가 설정된 어시스턴트 메시지에서는 null이에요. 클라이언트 단언 기록과 합성 마커는 모델이 만든 것이 아니고 사용 불가 콘텐츠의 서빙 모델은 알 수 없기 때문이에요. text 블록은 text와 truncated를 담아요. tool_use 블록은 id, name, input, truncated를 담으며 input은 객체가 아니라 JSON 인코딩 문자열이에요. tool_result 블록은 tool_use_id, name, is_error, text 항목의 content 배열, truncated를 담아요. MCP 도구 호출·결과와 대부분의 서버 도구 호출·결과는 이 동일한 tool_use·tool_result 형태로 정규화돼요. 다른 블록 유형은 [<block type> content not shown] 자리 표시자로 나타나요. 메시지 id는 턴이 보존되는 동안 안정적이에요. 같은 추론 호출에서 재구성된 모든 메시지는 그 호출의 타임스탬프를 담으므로 연속 메시지가 같은 created_at 값을 공유하는 경우가 많아요. 타임스탬프로 다시 정렬하지 말고 반환된 순서를 보존하세요.
각 메시지는 콘텐츠가 어떻게 캡처됐는지 설명하는 provenance 필드도 담아요. provenance는 Claude API가 캡처한 검증된 콘텐츠에 대해 null이며 이것이 일반적인 경우예요. 그 외에는 예외를 표시하는 type을 가진 객체예요:
content_unavailable는 콘텐츠를 반환할 수 없음을 의미해요.content배열은 비어 있고provenance.reason이 이유를 말해요.not_captured는 턴에 사용할 수 있는 콘텐츠가 없음을 의미해요. 기록이 저장되지 않았다는 것을 증명하지는 않아요. Anthropic의 데이터 처리 정책이 Compliance API에서 보류하는 콘텐츠도 같은 이유로 보고되며, 그런 이유로 사용 불가한 그 외 캡처된 세션 안의 개별 턴도 그렇고요. 사용 불가한 고객 관리 키가 유일한 예외이며 503 Service Unavailable을 대신 반환해요.client_aborted는 클라이언트가 응답 완료 전에 연결을 닫았거나 요청을 취소해서 턴의 응답이 캡처되지 않았음을 의미해요. 이미 클라이언트로 스트리밍된 부분 출력은 포함되지 않으며 이 이유는 어시스턴트 역할 턴에만 적용돼요.cmek_key_revoked는 조직의 고객 관리 키(예: 철회)를 사용할 수 없을 때 그 키 아래에서 암호화된 콘텐츠용으로 예약돼 있어요. 사용 불가한 키는 503을 만들기 때문에 현재는 반환되지 않지만 정방향 호환을 위해 처리하세요.retention_elapsed는 콘텐츠가 보존을 지났음을 의미해요.oversize는 단일 메시지가 메시지당 크기 한도를 초과했음을 의미해요. 메시지는 비어 있는content배열과 함께 여전히 반환돼요.client_asserted는 클라이언트가 대화 기록으로 제공하고 캡처된 응답과 일치시킬 수 없었던 어시스턴트 메시지를 표시해요. 그 저자는 검증되지 않았어요.synthetic_marker는 엔드포인트 자체가 생성한 기록(시스템 프롬프트를 대신하는 마커 같은 것)을 표시해요. 클라이언트가 세션 중간에 대화 기록을 다시 쓰거나 압축할 때(예: 컨텍스트 압축 후) 기록은 그 시점에 마커 메시지를 삽입하고 클라이언트가 보낸 새 콘텐츠로 계속해요. 조직에 유한 보존 기간이 있고 그 새 콘텐츠에 어시스턴트 메시지가 포함되면, 기록은 마지막 어시스턴트 메시지까지의 새 콘텐츠를 보류하고(두 번째 마커가 이를 알림) 그 지점 이후의 사용자 메시지만 보여준 뒤 나머지 세션을 이어가요.
마커·클라이언트 단언 메시지는 truncated: true로 표시된 괄호 설명 text 블록(예: [system prompt content not shown])으로 시작해요. 이 기록들을 없는 것으로가 아니라 있으나 사용 불가·미검증인 것으로 취급하고, 인식하지 못하는 provenance 유형·이유를 허용하세요.
두 매개변수가 각 도구 블록의 반환 바이트 수를 제한해요: tool_use_input_max_bytes와 tool_result_max_bytes, 둘 다 기본 10,000바이트. 서버 최대값(문자열당 약 1MiB)에는 -1을 전달하세요. 0은 400 Bad Request를 반환하고 최대값 위의 값은 최대값으로 잘려요. 어느 쪽 한도로 잘리는 문자열은 문자 경계에서 잘리고 인밴드 접미사(예: …[truncated; pass tool_result_max_bytes=-1 for the server max])가 붙으며 블록은 "truncated": true를 담아요. 잘린 tool_use input은 더 이상 유효한 JSON이 아니므로 잘리지 않은 블록에서만 도구 입력을 파싱하세요(또는 한도를 올리고 다시 가져오세요). text 유형 블록은 항상 약 1MiB의 같은 서버 최대값으로 제한돼요. 어떤 매개변수도 이를 높이지 않고, 경계에서 text 블록도 "truncated": true를 담아요.
Claude Science는 커넥터(MCP 서버)를 별도로 이름 붙인 도구가 아니라 repl 도구를 통해 실행하는 코드에서 호출해요. 그래서 Claude Science 기록의 어떤 블록도 커넥터 이름을 가지지 않아요. 각 커넥터 호출은 repl tool_use 블록의 input 안 코드(예: host.mcp("<server>", "<tool>", ...) 호출)에 나타나고, 커넥터 출력은 그 코드가 출력한 곳의 일치하는 tool_result에만 나타나요. Cowork·Claude Code 세션은 달라요. 각 커넥터 도구를 자체 mcp__<server>__<tool> 이름으로 호출하며, 이것이 tool_use 블록의 name이에요. Claude Science 세션의 커넥터 사용을 모니터링하려면 input 문자열을 파싱하고 도구 이름이 아니라 포함된 코드를 매칭하세요. 이 세션들에는 tool_use_input_max_bytes=-1을 전달해 긴 코드 입력이 커넥터 호출이 나타나기 전에 10,000바이트 기본값으로 잘리지 않고 서버 최대값까지 반환되게 하세요.
기록 콘텐츠는 사용자 기기의 세션 아래 설명된 보존 기간을 존중해요. 세션의 시작이 보존을 지나면 기록은 reason이 retention_elapsed인 단일 content_unavailable 자리 표시자로 시작하고 보존된 메시지가 따라와요. 세션의 모든 호출이 지나가면 messages 엔드포인트는 404 Not Found를 반환하며, 키가 읽을 수 없는 조직의 세션, 존재하지 않는 세션, 제로 데이터 보존이 적용 중인 세션에 대해서도 그렇게 해요. 잘못된 세션 ID는 400 Bad Request를 반환해요.
클라우드의 세션 (원격 세션)
claude.ai 웹·모바일에서 시작된 Cowork 세션은 Anthropic 관리 환경의 클라우드에서 실행돼요. Compliance API는 두 개의 엔드포인트로 이 원격 세션을 노출해요. GET /v1/compliance/apps/sessions/remote는 세션 메타데이터를 나열하고 GET /v1/compliance/apps/sessions/remote/{session_id}/messages는 한 세션의 기록을 반환해요. 둘 다 read:compliance_user_data 범위가 필요하고 공유 Compliance API 요금 한도와 이 엔드포인트 특유의 두 번째 요청 예산에 모두 계산돼요. 429 Too Many Requests 참고.
목록 엔드포인트는 기본적으로 조직 전체 범위예요. organization_ids[]를 생략하면 키가 읽을 수 있는 모든 claude.ai 조직을 포함하고, 범위를 좁히려면 최대 500개 값을 전달해요. 목록을 특정 사용자로 범위 지정하려면 1~10개의 user_ids[] 값을 전달하세요(ID는 조직 사용자 목록화에서 얻음). 필터는 세션의 소유 사용자를 일치시키므로 user_ids[]가 설정되면 에이전트 소유 세션은 제외돼요. created_at 범위 매개변수(gte, gt, lt, lte, RFC 3339 형식)로 결과를 시간에 따라 경계지으세요. updated_at 필터는 없어요. 다음 요청은 특정 날짜 이후 만들어진 세션을 나열해요.
curl --fail-with-body -sS -G \
"https://api.anthropic.com/v1/compliance/apps/sessions/remote" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--data-urlencode "created_at.gte=2026-06-01T00:00:00Z" \
--data-urlencode "limit=100"
{
"data": [
{
"id": "cse_01WpQrStUvXyZaBcDeFgHjK6",
"organization_uuid": "91012d09-e48b-438e-a489-1bebfd8fa6f9",
"user": {
"id": "user_01XyDMpzjS89pFZXqSFUBDr6",
"email_address": "[email protected]"
},
"agent_id": null,
"started_by_user": null,
"status": "active",
"created_at": "2026-07-01T17:04:05Z",
"updated_at": "2026-07-01T18:00:41Z",
"product_surface": "cowork_remote",
"claude_project_id": "claude_proj_01KGp4eZNug9ri4kE35RSppq"
},
{
"id": "cse_01TkNpRsUvWxYzAbCdEfGhJ4",
"organization_uuid": "91012d09-e48b-438e-a489-1bebfd8fa6f9",
"user": null,
"agent_id": "cagt_01MnPqRsTuVwXyZaBcDeFgH8",
"started_by_user": {
"id": "user_01XyDMpzjS89pFZXqSFUBDr6",
"email_address": "[email protected]"
},
"status": "archived",
"created_at": "2026-06-28T09:15:22Z",
"updated_at": "2026-06-28T09:47:10Z",
"product_surface": "cowork_remote",
"claude_project_id": null
}
],
"next_page": "page_AAEfMk93cXpYdGxrZXk"
}
결과는 created_at 역시간순(최신순)으로 정렬되고 응답당 limit 결과로 제한돼요(기본 100, 최대 500). 엔드포인트는 page·next_page 토큰으로 페이지네이션해요(결과 페이지네이션 참고). 다음 요청의 page 쿼리 매개변수로 응답의 next_page 값을 전달하고 next_page가 null일 때 멈추세요.
세션은 사용자 또는 에이전트 중 하나가 소유하며 둘 다인 경우는 없어요. 사용자 소유 세션의 경우 user가 소유자의 ID·이메일 주소를 담고(email_address는 사용자가 키가 읽을 수 있는 조직의 구성원이 아닐 때 null) agent_id는 null이에요. 에이전트 소유 세션(예: 예약 작업)의 경우 user는 null, agent_id는 에이전트의 ID(cagt_ 접두사), started_by_user는 예약 작업 시작 같은 방식으로 실행을 시작한 인간을 식별해요. 사용자 소유 세션에서 started_by_user는 null이에요.
claude_project_id는 세션이 속한 claude.ai 프로젝트의 ID(claude_proj_ 접두사)이고 세션이 프로젝트에 없으면 null이에요.
status는 pending, active, paused, archived, failed 중 하나예요. 세션은 프로비저닝되는 동안 pending이에요. pending 세션은 아직 기록이 없고 messages 엔드포인트는 프로비저닝이 완료될 때까지 404를 반환해요. 삭제된 세션은 절대 반환되지 않아요.
product_surface(string 또는 null)는 세션을 만든 제품을 식별해요. 엔드포인트는 현재 product_surface가 cowork_remote인 세션(즉 claude.ai 웹·모바일에서 시작된 Cowork 세션)만 반환해요.
정방향 호환 핸들러를 만드세요. 인식하지 못하는
status·product_surface값은 그대로 통과시키고 핸들러가 예상하지 못한 필드는 무시해서, 새 상태·제품 표면이 출시돼도 통합이 계속 작동하게 하세요.
원격 세션 기록 조회
messages 엔드포인트는 세션의 기록(사용자 프롬프트, 어시스턴트 응답, 도구 호출·결과)을 반환해요. Thinking 블록과 이미지는 포함되지 않아요. 커버리지 요약은 Compliance API FAQ를, 원격 세션을 로컬 세션·Cowork의 OpenTelemetry 로깅과 비교한 표는 이 페이지의 소개를 참고하세요.
session_id="cse_01WpQrStUvXyZaBcDeFgHjK6"
curl --fail-with-body -sS \
"https://api.anthropic.com/v1/compliance/apps/sessions/remote/$session_id/messages" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01"
{
"session": {
"id": "cse_01WpQrStUvXyZaBcDeFgHjK6",
"organization_uuid": "91012d09-e48b-438e-a489-1bebfd8fa6f9",
"user": {
"id": "user_01XyDMpzjS89pFZXqSFUBDr6",
"email_address": null
},
"agent_id": null,
"started_by_user": null,
"status": "active",
"created_at": "2026-07-01T17:04:05Z",
"updated_at": "2026-07-01T18:00:41Z",
"product_surface": "cowork_remote",
"claude_project_id": null
},
"data": [
{
"id": "csev_01HjKmNpQrStUvWxYzAbCdE2",
"role": "user",
"created_at": "2026-07-01T17:04:05Z",
"content": [
{
"type": "text",
"text": "Summarize the customer feedback in the attached spreadsheet.",
"truncated": false
}
],
"sent_by_user_id": null,
"content_unavailable": false
},
{
"id": "csev_01BcDeFgHjKmNpQrStUvWxY4",
"role": "assistant",
"created_at": "2026-07-01T17:04:06Z",
"content": [
{
"type": "text",
"text": "I'll start by reading the spreadsheet...",
"truncated": false
}
],
"sent_by_user_id": null,
"content_unavailable": false
}
],
"next_page": null
}
응답은 페이지네이트된 data 배열 옆에 session 봉투를 포함해요. 이 엔드포인트에서 봉투는 항상 user.email_address, started_by_user, claude_project_id를 null로 설정해요. 그 값은 대신 목록 엔드포인트에서 얻으세요.
메시지는 기본적으로 오래된 것부터 반환돼요. order=desc를 전달하면 뒤집혀요. 페이지네이션은 목록 엔드포인트와 같은 page/next_page 방식을 사용하며 limit 기본값 100, 최대 1,000이에요. 응답이 크기 한도에 도달하면 페이지가 일찍 끝날 수 있으므로 limit보다 적은 메시지 페이지가 끝을 의미하지는 않아요. next_page가 null이 될 때까지 계속 페이지네이션하세요.
각 메시지는 role(user 또는 assistant)과 text·tool_use·tool_result 블록의 content 배열을 담아요. 메시지 created_at 값은 커밋 타임스탬프예요. 연속 메시지가 같은 타임스탬프를 공유하거나 약간 역전될 수 있으므로 created_at으로 다시 정렬하지 말고 반환된 순서를 보존하세요. 에이전트 소유 세션에서 sent_by_user_id는 귀속될 수 있는 경우 주어진 사용자 메시지를 보낸 사용자를 기록하고, 그 외에는(모든 어시스턴트 메시지 포함) null이에요. 메시지의 콘텐츠를 전혀 반환할 수 없을 때(예: 크기 한도 초과) 메시지는 content_unavailable을 true로 설정해요.
두 매개변수가 각 도구 블록의 반환 바이트 수를 제한해요: tool_use_input_max_bytes와 tool_result_max_bytes, 둘 다 기본 10,000바이트. 서버 최대값(문자열당 약 1MiB)에는 -1을 전달하세요. 0은 400 Bad Request를 반환해요. 어느 쪽 한도로 잘리는 블록은 "truncated": true를 담고, 잘린 tool_use 입력은 더 이상 유효한 JSON이 아니므로 잘리지 않은 블록에서만 도구 입력을 파싱하세요(또는 한도를 올리고 다시 가져오세요).
messages 엔드포인트는 pending 세션, 존재하지 않거나 삭제된 세션, 키가 읽을 수 없는 조직의 세션에 대해 404 Not Found를 반환해요.
보존과 삭제
세션 엔드포인트는 읽기 전용이에요. 로컬·원격 세션은 Compliance API로는 삭제할 수 없어요. 로컬 세션 기록은 기본적으로 6년, 또는 유한 커스텀 대화 보존 기간을 설정한 조직에서는 그 기간 동안 보존돼요(사용자 기기의 세션 참고). 원격 세션 기록은 사용자가 더 일찍 삭제하지 않는 한 6년 동안 보존돼요. 사용자가 삭제하면 원격 세션 엔드포인트는 더 이상 그 세션을 반환하지 않고 기록은 Compliance API로 복구할 수 없어요. 이 기간들이 Anthropic의 다른 보존 방식과 어떻게 어울리는지는 API 및 데이터 보존 참고.
다음 단계
- 채팅·파일·프로젝트 조회 및 삭제 — 이동 — 같은 Compliance Access Key로 claude.ai 채팅 콘텐츠, 파일 첨부, 프로젝트에 접근하세요.
- Compliance API FAQ — 이동 — 세션 기록이 포함하는 것의 필드별 요약과 기타 일반적인 질문.
- Compliance API 오류 처리 — 이동 — 그대로의 오류 페이로드와 각각의 해결책.
- API 참조 — 이동 — Compliance API의 엔드포인트 경로, 매개변수, 응답 스키마.