---
title: Claude Tag API
url: https://platform.claude.com/docs/ko/manage-claude/claude-tag-api
description: Claude Enterprise 조직의 Slack용 Claude Tag를 자체 시스템에서 관리합니다. 채널, 워크스페이스, 조직의 Slack 기본값에 대한 설정을 읽고 변경하며, 어떤 설정이 적용되는지와 그 이유를 확인하고, Access bundle을 연결할 수 있습니다.
---

[Claude Tag](https://claude.com/docs/claude-tag/overview)는 Slack에서 팀원처럼 일하는 Claude입니다. 누군가 채널에서 Claude를 멘션하면 Claude가 스레드에서 답변합니다. Claude Tag API를 사용하면 조직 소유자가 [claude.ai > Organization settings > Claude Tag](https://claude.ai/admin-settings/claude-tag)에서 직접 설정하는 Claude Tag 설정을 자체 시스템에서 읽고 변경할 수 있습니다. 승인 워크플로에서 채널별로 Claude를 켜거나, 구성을 버전 관리에 보관하거나, 모든 채널에 무엇이 적용되는지 감사하는 데 사용하세요.

Claude Tag는 claude.ai 제품입니다. 이 API는 Claude Enterprise 조직을 위해 Claude Tag를 관리하며, Claude Platform 워크스페이스, API 사용량 또는 Claude Console과는 관련이 없습니다.

<Check>
  **범위가 지정된 Admin API 키 필요**

  이 엔드포인트에는 `read:claude_tag` 범위(`GET` 엔드포인트용) 또는 `write:claude_tag` 범위(`POST` 및 `DELETE` 엔드포인트용)를 가진 Admin API 키가 필요합니다. [범위](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#scopes)를 참조하세요. 기본 소유자가 키를 생성하는 위치는 [Admin API 키 생성](https://platform.claude.com/docs/ko/manage-claude/admin-api-keys#create-a-key-for-a-claude-enterprise-organization)을 참조하세요. 모든 요청에서 `x-api-key` 헤더에 키를 전달하고, [`anthropic-version`](https://platform.claude.com/docs/ko/api/versioning) 헤더와 다음 참고에 표시된 베타 헤더도 함께 전달하세요.
</Check>

<Note>
  Claude Tag API는 **베타** 상태이며 Claude Enterprise 조직에서만 사용할 수 있습니다. Claude Platform(Claude Console) 조직에서는 사용할 수 없습니다.

  모든 요청에는 [베타 헤더](https://platform.claude.com/docs/ko/api/beta-headers) `anthropic-beta: claude-tag-2026-09-28`이 포함되어야 합니다(SDK와 `ant` CLI는 이를 자동으로 전송합니다). 이 헤더가 없는 요청은 엔드포인트가 존재하지 않는 것과 똑같이 `404`를 반환합니다.
</Note>

## 엔드포인트

이 API는 5개 리소스에 걸쳐 18개의 엔드포인트를 제공합니다:

| 리소스                                                                                       | 엔드포인트                                                                                                                                                                                                                                                                                                                                                                   |
| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Slack 채널:** 채널 설정, 워크스페이스의 채널 목록 조회 또는 Slack ID로 채널 찾기, 채널 읽기, 설정 변경, 적용되는 설정 확인, 채널 제거 | `POST /v1/organizations/claude_tag/slack_channels`<br />`GET /v1/organizations/claude_tag/slack_channels`<br />`GET /v1/organizations/claude_tag/slack_channels/{id}`<br />`POST /v1/organizations/claude_tag/slack_channels/{id}`<br />`GET /v1/organizations/claude_tag/slack_channels/{id}/effective`<br />`DELETE /v1/organizations/claude_tag/slack_channels/{id}` |
| **Slack 워크스페이스:** 연결된 워크스페이스 목록 조회 또는 Slack ID로 워크스페이스 찾기, 워크스페이스 읽기, 설정 변경, 적용되는 설정 확인   | `GET /v1/organizations/claude_tag/slack_workspaces`<br />`GET /v1/organizations/claude_tag/slack_workspaces/{id}`<br />`POST /v1/organizations/claude_tag/slack_workspaces/{id}`<br />`GET /v1/organizations/claude_tag/slack_workspaces/{id}/effective`                                                                                                                |
| **Slack 기본값:** 모든 워크스페이스와 채널에 적용되는 설정 읽기 및 변경                                             | `GET /v1/organizations/claude_tag/slack_defaults`<br />`POST /v1/organizations/claude_tag/slack_defaults`                                                                                                                                                                                                                                                               |
| **Bundle:** 조직의 Access bundle 목록 조회, Bundle 읽기(읽기 전용)                                     | `GET /v1/organizations/claude_tag/bundles`<br />`GET /v1/organizations/claude_tag/bundles/{bundle_id}`                                                                                                                                                                                                                                                                  |
| **Bundle 대상:** Bundle이 연결된 위치 목록 조회, 채널 또는 워크스페이스에 연결, 연결 하나 읽기, 분리                       | `GET /v1/organizations/claude_tag/bundles/{bundle_id}/targets`<br />`POST /v1/organizations/claude_tag/bundles/{bundle_id}/targets`<br />`GET /v1/organizations/claude_tag/bundles/{bundle_id}/targets/{target_id}`<br />`DELETE /v1/organizations/claude_tag/bundles/{bundle_id}/targets/{target_id}`                                                                  |

이번 릴리스는 Slack을 다룹니다. Slack 워크스페이스 연결 및 연결 해제, Access bundle 생성 및 편집, 지출 한도, 그리고 [설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#settings)에 있는 다섯 가지를 제외한 모든 Claude Tag 설정은 claude.ai에서 관리합니다.

## 사전 요구 사항

* 조직이 Claude Enterprise 플랜을 사용 중이어야 하며, [Claude Tag가 설정](https://claude.com/docs/claude-tag/admins/setup-overview)되어 있고 하나 이상의 Slack 워크스페이스가 연결되어 있어야 합니다.
* 기본 소유자가 [claude.ai > Organization settings > API](https://claude.ai/admin-settings/api-access)에서 `read:claude_tag` 범위, `write:claude_tag` 범위 또는 둘 다를 가진 Admin API 키를 생성합니다. [Admin API 키 생성](https://platform.claude.com/docs/ko/manage-claude/admin-api-keys#create-a-key-for-a-claude-enterprise-organization)을 참조하세요.
* 모든 요청에는 `x-api-key`, `anthropic-version: 2023-06-01`, `anthropic-beta: claude-tag-2026-09-28`의 세 가지 헤더가 포함됩니다.

Python, TypeScript, C#, Go, Java, PHP, Ruby SDK는 이 엔드포인트를 `client.beta.organization.claude_tag` (typescript: `client.beta.organization.claudeTag`; csharp, go: `client.Beta.Organization.ClaudeTag`; java: `client.beta().organization().claudeTag()`; php: `$client->beta->organization->claudeTag`) 아래에, [`ant` CLI](https://platform.claude.com/docs/ko/cli-sdks-libraries/cli/quickstart)는 `ant beta:organization:claude-tag` 아래에 제공하며, `anthropic-version` 및 `anthropic-beta` 헤더를 자동으로 전송합니다. 이 페이지의 예제는 각 SDK의 기본 클라이언트를 사용하며, 이 클라이언트는 CLI와 마찬가지로 `ANTHROPIC_API_KEY` 환경 변수에서 Admin API 키를 읽습니다. curl 예제는 같은 변수에서 키를 읽어 `x-api-key` 헤더로 전달합니다. SDK나 CLI가 추가 페이지를 자동으로 가져오는 경우, `limit`은 전체 개수가 아니라 페이지 크기를 설정합니다([페이지네이션](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#pagination) 참조).

API 키는 조직에 속하며, 키를 생성한 사람이 조직을 떠난 후에도 계속 작동합니다. 키를 공유하거나 소스 제어에 체크인하지 마세요.

## 빠른 시작

조직이 Claude Tag에 연결한 Slack 워크스페이스 목록을 조회합니다:

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_workspaces" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-workspaces list
  ```

  ```python Python
  client = anthropic.Anthropic()

  workspaces = client.beta.organization.claude_tag.slack_workspaces.list()

  # 필요에 따라 추가 페이지를 자동으로 가져옵니다.
  for workspace in workspaces:
      print(f"{workspace.id}: {workspace.slack.team_id}")
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const workspaces = await client.beta.organization.claudeTag.slackWorkspaces.list();

  for await (const workspace of workspaces) {
    console.log(`${workspace.id}: ${workspace.slack.team_id}`);
  }
  ```

  ```csharp C#
  AnthropicClient client = new();

  var page = await client.Beta.Organization.ClaudeTag.SlackWorkspaces.List();

  await foreach (var workspace in page.Paginate())
  {
      Console.WriteLine($"{workspace.ID}: {workspace.Slack.TeamID}");
  }
  ```

  ```go Go
  client := anthropic.NewClient()

  workspaces := client.Beta.Organization.ClaudeTag.SlackWorkspaces.ListAutoPaging(
  	context.Background(),
  	anthropic.BetaOrganizationClaudeTagSlackWorkspaceListParams{},
  )

  for workspaces.Next() {
  	workspace := workspaces.Current()
  	fmt.Printf("%s: %s\n", workspace.ID, workspace.Slack.TeamID)
  }
  if err := workspaces.Err(); err != nil {
  	log.Fatal(err)
  }
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var workspaces = client.beta().organization().claudeTag().slackWorkspaces().list();

  for (var workspace : workspaces.autoPager()) {
      IO.println(workspace.id() + ": " + workspace.slack().teamId());
  }
  ```

  ```php PHP
  $client = new Client();

  $workspaces = $client->beta->organization->claudeTag->slackWorkspaces->list();

  // 이 페이지만 해당합니다. 다음 페이지는 page: $workspaces->nextPage로 list()를 다시 호출하세요.
  foreach ($workspaces->getItems() as $workspace) {
      echo "{$workspace->id}: {$workspace->slack->teamID}\n";
  }
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  page = client.beta.organization.claude_tag.slack_workspaces.list

  page.auto_paging_each do |workspace|
    puts "#{workspace.id}: #{workspace.slack.team_id}"
  end
  ```
</CodeGroup>

```json Response
{
  "data": [
    {
      "type": "slack_workspace",
      "id": "slws_011CZkZnWa7xPc3uJfZe5LgT",
      "slack": {
        "team_id": "T01ABCD2EFG"
      },
      "settings": {
        "enabled": null,
        "instructions": "Answer in English unless asked otherwise.",
        "model": null,
        "environment_id": null,
        "guest_policy": null
      },
      "agent_id": "cagt_011CZkZrFy4aSg8uMkDt9PqW",
      "created_at": "2026-09-02T17:04:11Z",
      "updated_at": "2026-10-06T09:41:53Z"
    }
  ],
  "next_page": null
}
```

`null`인 설정은 이 워크스페이스에 설정되지 않은 것이므로 워크스페이스가 해당 설정을 상속합니다. [저장된 설정과 유효 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#stored-and-effective-settings)을 참조하세요.

## 범위

| 범위                 | 부여 권한                                                                            |
| ------------------ | -------------------------------------------------------------------------------- |
| `read:claude_tag`  | 이 페이지의 모든 `GET` 엔드포인트.                                                           |
| `write:claude_tag` | 이 페이지의 모든 `POST` 및 `DELETE` 엔드포인트. 변경에 대한 응답에는 변경된 리소스가 포함되지만, 읽기 권한은 부여하지 않습니다. |

하나의 키가 두 범위를 모두 가질 수 있습니다. 채널을 조회한 다음 변경하는 통합에는 두 범위가 모두 필요합니다. 다른 어떤 범위도 이 엔드포인트에 대한 액세스 권한을 부여하지 않습니다.

키는 조직 전체에 속해야 합니다. 조직은 항상 키가 속한 조직이며, 어떤 요청도 조직을 지정하지 않습니다. `anthropic-workspace-id` 헤더를 보내는 요청은 `400`을 반환합니다. 여기에 있는 어떤 것도 Claude Platform 워크스페이스에 속하지 않기 때문입니다.

## 주요 개념

### 이 페이지와 claude.ai에서의 명칭

| 이 API            | claude.ai 및 Slack                                                                                                                            |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Slack 워크스페이스     | Slack 워크스페이스(Slack에서는 팀이라고도 부름). ID가 `wrkspc_`로 시작하는 Claude Platform 워크스페이스와는 관련이 없습니다.                                                      |
| Slack 기본값        | **Default Slack access**                                                                                                                     |
| 설정 수준            | [범위](https://claude.com/docs/claude-tag/admins/customize): 채널, 워크스페이스 또는 Slack 기본값                                                           |
| Bundle           | [Access bundle](https://claude.com/docs/claude-tag/concepts/glossary#access-bundle)                                                          |
| `enabled`        | **Enable Claude Tag in Slack** 스위치                                                                                                           |
| `instructions`   | **Custom instructions**                                                                                                                      |
| `model`          | **Model**                                                                                                                                    |
| `environment_id` | **Environment**                                                                                                                              |
| `guest_policy`   | **How should Claude work in channels with guests**: `restrict`는 **Restrict**, `channel_only`는 **Channel only**, `allow`는 **Full access**에 해당 |

### 설정된 채널과 워크스페이스

Claude Tag가 채널 또는 워크스페이스에 대한 설정 레코드를 보유하면 해당 채널 또는 워크스페이스는 **설정된(set up)** 상태입니다. 설정된 채널 또는 워크스페이스만 `id`를 가지며, 이들만 목록에 표시됩니다. 워크스페이스의 전체 채널 목록은 이 API가 아니라 Slack이 보유합니다.

* **워크스페이스**는 조직 소유자가 claude.ai에서 연결할 때 설정됩니다. 워크스페이스를 설정하거나 제거하는 엔드포인트는 없습니다.
* **채널**은 claude.ai에서, 채널에서 Claude를 처음 사용할 때, 또는 [채널 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#set-up-a-channel)을 통해 설정됩니다.
* **Slack 기본값**은 누군가 처음으로 Claude Tag를 설정할 때 설정됩니다. 즉, 소유자가 Slack 워크스페이스를 연결하거나, 멤버가 Slack에서 Claude에 로그인하거나 처음 사용할 때입니다.

조직은 연결이 활성 상태인 동안 워크스페이스를 소유하며, 그 안의 채널도 소유합니다. 소유하지 않은 채널 또는 워크스페이스는 존재하지 않는 것과 동일한 `404`를 반환합니다.

### ID

채널은 Slack이 보여주는 ID로 알 수 있습니다. [Slack ID로 채널 찾기](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#find-a-channel-by-its-slack-ids)를 사용해 채널의 `id`를 한 번 조회한 다음, 그 `id`를 저장하여 사용하세요.

| ID               | 접두사        | 나타나는 위치                                        |
| ---------------- | ---------- | ---------------------------------------------- |
| Slack 채널 리소스     | `slch_`    | 채널의 `id`; 요청 본문과 응답의 `slack_channel_id`        |
| Slack 워크스페이스 리소스 | `slws_`    | 워크스페이스의 `id`; 요청 본문과 응답의 `slack_workspace_id`  |
| Bundle           | `capp_`    | Bundle의 `id`; 경로의 `{bundle_id}`                |
| Bundle 대상        | `btgt_`    | Bundle 대상의 `id`; 경로의 `{target_id}`             |
| Slack 자체 팀 ID    | `T`        | `slack.team_id`; `slack_team_id` 쿼리 매개변수       |
| Slack 자체 채널 ID   | `C` 또는 `G` | `slack.channel_id`; `slack_channel_id` 쿼리 매개변수 |

<Warning>
  `slack_channel_id`는 두 가지 의미를 가집니다. **쿼리 매개변수**에서는 Slack 자체 ID(`C05HJKL6MNP`)입니다. **요청 본문 또는 응답**에서는 이 API가 발급하는 `id`(`slch_...`)입니다. 본문이나 응답에서 Slack 자체 ID는 항상 `slack` 아래에 있습니다.
</Warning>

`id`는 채널 또는 워크스페이스가 설정되어 있는 동안 무엇을 변경하든 바뀌지 않으며, [읽기 전용 모드](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#read-only-mode)에 설명된 한 가지 예외만 있습니다. 제거된 후 다시 설정된 채널 또는 워크스페이스는 새 `id`를 가지며, 이전 `id`는 계속 `404`를 반환합니다. 저장된 `id`가 `error_code` 없이 `404`를 반환하면, 같은 키와 헤더로 [Slack 기본값을 가져오세요](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#get-the-slack-defaults). 이 요청은 채널이나 워크스페이스를 지정하지 않으므로, `404` 이외의 상태는 해당 `id`가 사라졌음을 의미합니다. 이 경우 Slack ID로 채널 또는 워크스페이스를 다시 찾으세요. 여기서도 `404`가 반환되면 `id`에 대해서는 아무것도 알 수 없습니다. 저장된 `id` 값을 유지하고 [오류 응답](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#error-responses)을 참조하세요.

`agent_id`(접두사 `cagt_`)는 [Compliance API](https://platform.claude.com/docs/ko/manage-claude/compliance-api)가 같은 채널 또는 워크스페이스를 지칭하는 방식으로, Claude가 그곳에서 실행한 세션의 소유자를 나타낼 때와 [Activity Feed 이벤트](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#activity-feed-events)에서 모두 사용됩니다. `id`가 유지되는 동안 함께 유지됩니다.

### 설정

각 설정 수준은 동일한 다섯 가지 설정을 저장하며, 모두 선택 사항입니다:

| 설정               | 유형      | 설명                                                                                                                                                                                                                                                                                                                                                          |
| ---------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `enabled`        | boolean | Claude가 켜져 있는지 여부.                                                                                                                                                                                                                                                                                                                                          |
| `instructions`   | string  | Claude가 모든 세션에서 읽는 상시 지침. 앞뒤 공백을 제거한 후 최대 8,192자. 빈 텍스트는 설정을 지웁니다.                                                                                                                                                                                                                                                                                          |
| `model`          | string  | 새 세션이 시작되는 모델: 조직이 Claude Tag에서 사용할 수 있는 [모델 ID](https://platform.claude.com/docs/ko/models/overview). 최대 128자.                                                                                                                                                                                                                                             |
| `environment_id` | string  | 세션이 실행되는 클라우드 환경으로, 접두사는 `env_`. 활성 상태여야 하며 조직에 속해야 합니다.                                                                                                                                                                                                                                                                                                    |
| `guest_policy`   | object  | Slack 게스트가 채널에 있는 동안 채널의 모든 사람에 대해 Claude가 하는 동작: `{"type": "allow"}`(Claude가 답변), `{"type": "restrict"}`(Claude가 답변하지 않음), 또는 `{"type": "channel_only"}`(Claude가 채널 자체에 연결된 Bundle만으로 답변). Slack Connect를 통해 공유되거나 Enterprise Grid 전반에 걸친 채널에서의 의미는 [게스트 채널 제한](https://claude.com/docs/claude-tag/admins/restrict-access#restrict-guest-channels)을 참조하세요. |

`model`과 `environment_id`는 값을 쓸 때 확인되며 이후에는 다시 확인되지 않습니다. 나중에 모델이나 환경이 변경되더라도 두 뷰 모두 저장된 값을 계속 반환합니다.

조직 소유자가 claude.ai에서 설정 수준에 자체 호스팅 러너 풀을 지정한 경우, 해당 `environment_id`는 `ccpool_`로 시작하는 풀의 ID를 반환합니다. 이 API는 러너 풀을 설정할 수 없으며, 러너 풀을 저장하고 있는 설정 수준에서 `environment_id`를 변경하거나 지우는 요청에 대해 `400`을 반환합니다.

### 저장된 설정과 유효 설정

설정은 세 가지 수준에 존재합니다: 채널, 채널이 속한 워크스페이스, 그리고 조직의 Slack 기본값입니다. 각 수준은 해당 수준에 설정된 것만 저장합니다. API는 두 가지 뷰를 제공합니다:

* **저장된(stored)** 뷰([채널 가져오기](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#get-a-channel), [워크스페이스 가져오기](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#get-a-workspace))는 채널 또는 워크스페이스 자체가 저장하는 내용을 담습니다. 그곳에 설정되지 않은 설정은 `null`입니다. 다른 곳에 보관하는 구성과 비교할 때 사용하세요.
* **유효(effective)** 뷰([채널의 유효 설정 가져오기](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#get-a-channels-effective-settings), [워크스페이스의 유효 설정 가져오기](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#get-a-workspaces-effective-settings))는 모든 수준을 고려했을 때 적용되는 내용을 담으며, `sources`는 각 값이 어느 수준에서 오는지를 나타냅니다. 감사하거나, 특정 채널에서 Claude가 왜 그렇게 동작하는지 알아낼 때 사용하세요.

각 설정은 개별적으로 결정됩니다:

| 설정               | 규칙                                                                               | 어떤 수준도 설정하지 않은 경우               |
| ---------------- | -------------------------------------------------------------------------------- | ------------------------------- |
| `enabled`        | 이를 설정한 가장 가까운 수준이 결정하므로, 워크스페이스가 `false`를 저장하더라도 채널의 `true`는 그 채널에서 Claude를 켭니다. | `true`                          |
| `instructions`   | 누적됩니다. 이를 설정한 모든 수준의 텍스트가 가장 넓은 수준부터 빈 줄을 사이에 두고 결합됩니다.                          | `null`                          |
| `model`          | 이를 설정한 가장 가까운 수준이 결정합니다.                                                         | `null`: Claude는 제품의 기본 모델을 사용   |
| `environment_id` | 이를 설정한 가장 가까운 수준이 결정합니다.                                                         | `null`                          |
| `guest_policy`   | 이를 설정한 가장 가까운 수준이 결정합니다.                                                         | Slack 기본값이 설정된 조직에서는 `restrict` |

예를 들어, 조직이 Slack 기본값에 지침을 저장하고, 한 워크스페이스에서 Claude를 끄고, 그 워크스페이스의 한 채널에 모델을 설정했다고 가정합니다. 채널의 유효 뷰는 세 값과 각 값의 출처를 보여줍니다:

```json
{
  "type": "slack_channel_effective",
  "id": "slch_011CZkZmRt4vNq8sHbYw2KdX",
  "settings": {
    "enabled": false,
    "instructions": "Be brief.",
    "model": "claude-opus-5-5",
    "environment_id": null,
    "guest_policy": { "type": "restrict" }
  },
  "sources": {
    "enabled": {
      "type": "slack_workspace",
      "slack_workspace_id": "slws_011CZkZnWa7xPc3uJfZe5LgT"
    },
    "instructions": [{ "type": "slack_defaults" }],
    "model": {
      "type": "slack_channel",
      "slack_channel_id": "slch_011CZkZmRt4vNq8sHbYw2KdX"
    },
    "environment_id": { "type": "default" },
    "guest_policy": { "type": "default" }
  }
}
```

출처는 다음 중 하나입니다:

| `type`                 | 의미                                                                                                                                                             |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `slack_channel`        | `slack_channel_id`에 지정된 채널.                                                                                                                                    |
| `slack_workspace`      | `slack_workspace_id`에 지정된 워크스페이스.                                                                                                                              |
| `slack_parent_channel` | 코드 채널의 상위 채널로, `slack_channel_id`에 지정됩니다. 코드 채널은 다른 채널에서 시작된 채널입니다. 상위 채널이 같은 워크스페이스의 공개 채널인 동안에는 채널과 워크스페이스 사이에 위치하며 `instructions`와 `environment_id`만 제공합니다. |
| `slack_defaults`       | 조직의 Slack 기본값으로, ID가 없음.                                                                                                                                       |
| `default`              | 어떤 수준도 값을 설정하지 않아 기본 제공 기본값이 적용됨.                                                                                                                              |

`sources.instructions`는 텍스트를 제공하는 모든 수준을 가장 넓은 수준부터 나열한 목록이며, 아무 수준도 제공하지 않으면 비어 있습니다. 채널 자체의 워크스페이스가 아니라 Slack Enterprise Grid 연결을 통해 채널에 접근하는 조직에서는 출처의 ID가 `null`일 수 있습니다.

### 설정 변경

세 가지 업데이트 엔드포인트와 [채널 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#set-up-a-channel)은 동일한 규칙에 따라 `settings` 객체를 받습니다:

* **생략한 설정은 변경되지 않습니다.** `{"settings": {"enabled": false}}`는 Claude를 끄고 나머지 네 가지 설정은 그대로 둡니다.
* **`null`로 보낸 설정은 지워지므로**, 해당 수준은 다시 그 설정을 상속합니다.
* **전부 아니면 전무.** 요청의 값 중 하나라도 거부되면 요청의 어떤 설정도 저장되지 않습니다.
* **반복해도 안전합니다.** 모든 변경은 첫 번째 동일한 요청이 남긴 상태로 리소스를 남기므로, 어떤 엔드포인트도 `Idempotency-Key`를 받지 않습니다. 아무것도 바꾸지 않는 요청은 아무것도 쓰지 않으며 Activity Feed 이벤트도 기록하지 않습니다.
* **마지막 쓰기가 우선합니다.** 어떤 요청도 전제 조건을 받지 않습니다. 각각 리소스를 읽은 다음 같은 설정을 변경하는 두 호출자는 서로를 덮어씁니다. `409`는 요청이 실행되는 동안 다른 변경이 겹칠 때만 반환됩니다. 이 경우 요청의 어떤 내용도 저장되지 않았으므로, 리소스를 다시 읽고 여전히 필요하다면 변경을 다시 보내세요.

채널의 `guest_policy`를 변경하면 해당 채널에서 실행 중인 세션이 종료될 수 있습니다. 세션은 백그라운드에서 종료되며, 응답은 이를 기다리지 않습니다.

### 구성된 수준

사람이나 키가 설정 수준의 설정을 변경하거나 Bundle을 연결하면 해당 수준은 **구성된(configured)** 상태가 됩니다. 이후 모든 설정이 지워지고 모든 Bundle이 분리되더라도 계속 구성된 상태로 유지됩니다. Claude의 첫 사용으로 설정되었거나 이 API를 통해 아무 설정도 지정하지 않고 설정된 채널은 첫 변경이나 첫 Bundle 연결 전까지는 구성된 상태가 아닙니다. 이는 두 곳에서 중요합니다: 구성된 채널만 [제거](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#remove-a-channel)할 수 있으며, 구성되지 않은 채널만 새 `id`를 받을 수 있습니다([읽기 전용 모드](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#read-only-mode) 참조).

### 읽기 전용 모드

**API / Terraform read-only mode**는 조직 소유자가 claude.ai의 Claude Tag 설정에서 켜고 끄는 설정입니다. 이 이름은 claude.ai와 Slack을 기준으로 합니다. 이 모드가 켜져 있는 동안 claude.ai와 Slack은 이 API가 관리하는 항목에 대한 사람의 변경을 거부하므로, 키만 해당 변경을 할 수 있습니다. 이 모드가 이 API를 읽기 전용으로 만드는 것은 아닙니다. 이 페이지의 모든 엔드포인트는 모드가 켜져 있든 꺼져 있든 동일하게 응답하며, 어떤 엔드포인트도 이 모드를 읽거나 변경하지 않습니다.

모드가 꺼져 있는 동안에는 사람과 키가 같은 설정을 변경하고 같은 Bundle을 연결 및 분리하며, 각 변경은 저장된 내용을 대체합니다. 파이프라인이 유일한 변경 출처가 되어야 한다면 이 모드를 켜세요.

모드가 켜져 있는 동안 claude.ai와 Slack은 다음을 거부합니다:

* 채널, 워크스페이스 또는 Slack 기본값에서 다섯 가지 설정 중 하나를 변경하는 것.
* claude.ai에서 채널을 설정하거나, 채널을 제거하거나, 워크스페이스 연결을 해제하는 것.
* 채널 또는 워크스페이스에 Bundle을 연결하거나, 분리하거나, 연결된 Bundle을 삭제하는 것.

어느 경우든 가능한 작업도 있습니다: 소유자는 여전히 새 워크스페이스를 연결하고, Bundle을 생성 및 편집하고, 이 API가 관리하지 않는 Claude Tag 설정을 변경할 수 있습니다. Claude의 첫 사용은 여전히 채널을 설정하고, Slack에서 채널을 삭제하면 여전히 채널이 제거되며, Claude의 Slack 앱을 제거하면 여전히 해당 워크스페이스의 연결이 해제됩니다.

모드가 꺼져 있는 동안, 이미 설정되어 있고 [구성되지](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#configured-levels) 않은 채널을 claude.ai에서 설정하면 채널의 레코드가 대체될 수 있습니다. 그러면 채널은 새 `id`와 `agent_id`를 가지며, 이전 `id`는 `404`를 반환합니다. 구성된 채널의 `id`는 채널이 제거될 때까지 유지됩니다.

### 그룹 다이렉트 메시지

Slack 그룹 다이렉트 메시지는 채널 형식의 ID를 가지므로, 그룹 다이렉트 메시지에서 Claude를 사용하면 채널처럼 설정됩니다. 즉, `id`를 가지고, 목록에 표시되며, 읽을 수 있습니다. 이 API를 통해 그룹 다이렉트 메시지를 설정하거나, 설정을 변경하거나, Bundle을 연결하면 각각 `400`을 반환합니다. Bundle 분리는 허용됩니다.

## 예제 워크플로

### 승인된 채널에서만 Claude 켜기

모든 멤버는 공개 채널에 Claude를 초대할 수 있습니다. 승인한 곳에서만 Claude를 켜 두려면:

1. [Slack 기본값](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#update-the-slack-defaults)에서 `enabled`를 `false`로 설정하여 모든 곳에서 Claude를 끄세요.
2. 승인 시스템이 채널을 승인하면 `"settings": {"enabled": true}`로 [채널을 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#set-up-a-channel)하세요. 이 요청은 Slack 자체 ID를 받으며 채널이 이미 설정되어 있는지와 관계없이 채널을 반환하므로 반복해도 안전합니다.
3. 같은 실행에서 팀이 승인받은 Bundle을 [연결](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#attach-a-bundle)하여, 채널의 첫 세션부터 도구를 사용할 수 있도록 하세요.

### 구성을 버전 관리에 보관

1. Slack이 각 채널에 대해 보여주는 ID를 기준으로 구성을 작성하고, 그 ID로 [각 채널을 찾으세요](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#find-a-channel-by-its-slack-ids).
2. **저장된** 뷰를 리포지토리에 선언된 내용과 비교하세요. 유효 뷰에는 상속된 값이 섞여 있습니다.
3. 차이가 있는 설정만 보내고, 리포지토리에서 더 이상 선언하지 않는 설정은 `null`로 보내세요.
4. 아무도 같은 설정을 직접 변경하지 않도록 조직 소유자에게 [읽기 전용 모드](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#read-only-mode)를 켜 달라고 요청하세요.

### 모든 곳에 적용되는 내용 감사

1. [워크스페이스 목록을 조회](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#list-workspaces)한 다음, [각 워크스페이스의 채널 목록을 조회](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#list-channels)하세요.
2. 각 채널의 [유효 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#get-a-channels-effective-settings)을 읽고, 승인 기록 없이 `enabled`가 `true`인 채널이나 `guest_policy`가 `allow`인 채널처럼 정책이 금지하는 항목을 표시하세요.
3. [Bundle 목록을 조회](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#list-bundles)한 다음 [각 Bundle의 대상](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#list-a-bundles-targets)을 조회하여, 민감한 시스템에 대한 액세스 권한이 어디에 연결되어 있는지 확인하세요.

## Slack 채널

채널 객체는 하나의 Slack 채널에 대한 저장된 뷰입니다:

| 필드           | 설명                                                                                                                                                                                                               |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `type`       | `slack_channel`.                                                                                                                                                                                                 |
| `id`         | `slch_` 접두사가 붙습니다. [ID](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#ids)를 참조하세요.                                                                                                            |
| `slack`      | Slack 자체 ID: 채널이 속한 워크스페이스의 `team_id`와 채널의 `channel_id`입니다.                                                                                                                                                      |
| `settings`   | 채널 자체가 저장하는 내용입니다. 항상 존재하며 다섯 가지 [설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#settings)을 모두 포함합니다. 설정되지 않은 항목은 `null`입니다.                                                               |
| `agent_id`   | `cagt_` 접두사가 붙습니다. [ID](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#ids)를 참조하세요.                                                                                                            |
| `created_at` | 채널이 설정된 시점입니다.                                                                                                                                                                                                   |
| `updated_at` | Claude Tag의 채널 레코드가 마지막으로 변경된 시점입니다. 여기, claude.ai 또는 Slack에서 설정이 변경될 때마다 갱신되며, 여기의 어떤 응답에도 나타나지 않는 변경으로 인해 갱신될 수도 있습니다. 더 나중의 값은 설정이 변경되었다는 증거가 아니라 채널을 다시 읽어야 할 이유로 취급하세요. Bundle을 연결하거나 분리하는 것만으로는 갱신되지 않습니다. |

`slch_` 접두사가 없는 `id`는 `400`을 반환합니다. 접두사는 있지만 조직의 어떤 채널도 가리키지 않는 `id`는 `404`를 반환합니다.

### 채널 설정

`POST /v1/organizations/claude_tag/slack_channels`는 Slack 채널을 설정하고 반환합니다. `slack.team_id`와 `slack.channel_id`는 필수이며 Slack 자체 ID입니다. `settings`는 선택 사항이며 [설정 변경](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#changing-settings)을 따릅니다. 채널이 이미 설정되어 있으면 요청은 기존 채널을 반환하고 `settings`를 적용합니다. 두 경우 모두 응답은 `200`입니다. `write:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl -X POST "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels" \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28" \
    -d '{
      "slack": {"team_id": "T01ABCD2EFG", "channel_id": "C05HJKL6MNP"},
      "settings": {"instructions": "Answer in the language of the question."}
    }'
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels create \
    --slack '{team_id: T01ABCD2EFG, channel_id: C05HJKL6MNP}' \
    --settings '{instructions: "Answer in the language of the question."}'
  ```

  ```python Python
  client = anthropic.Anthropic()

  channel = client.beta.organization.claude_tag.slack_channels.create(
      slack={"team_id": "T01ABCD2EFG", "channel_id": "C05HJKL6MNP"},
      settings={"instructions": "Answer in the language of the question."},
  )

  print(channel.id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const channel = await client.beta.organization.claudeTag.slackChannels.create({
    slack: { team_id: "T01ABCD2EFG", channel_id: "C05HJKL6MNP" },
    settings: { instructions: "Answer in the language of the question." }
  });

  console.log(channel.id);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var channel = await client.Beta.Organization.ClaudeTag.SlackChannels.Create(
      new()
      {
          Slack = new() { TeamID = "T01ABCD2EFG", ChannelID = "C05HJKL6MNP" },
          Settings = new() { Instructions = "Answer in the language of the question." },
      }
  );

  Console.WriteLine(channel.ID);
  ```

  ```go Go
  client := anthropic.NewClient()

  channel, err := client.Beta.Organization.ClaudeTag.SlackChannels.New(
  	context.Background(),
  	anthropic.BetaOrganizationClaudeTagSlackChannelNewParams{
  		Slack: anthropic.BetaClaudeTagSlackChannelIdentifiersParam{
  			TeamID:    "T01ABCD2EFG",
  			ChannelID: "C05HJKL6MNP",
  		},
  		Settings: anthropic.BetaClaudeTagSettingsCreateParam{
  			Instructions: anthropic.String("Answer in the language of the question."),
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(channel.ID)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.BetaClaudeTagSettingsCreate;
  import com.anthropic.models.beta.organization.claudetag.slackchannels.BetaClaudeTagSlackChannelIdentifiers;
  import com.anthropic.models.beta.organization.claudetag.slackchannels.SlackChannelCreateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = SlackChannelCreateParams.builder()
          .slack(BetaClaudeTagSlackChannelIdentifiers.builder()
              .teamId("T01ABCD2EFG")
              .channelId("C05HJKL6MNP")
              .build())
          .settings(BetaClaudeTagSettingsCreate.builder()
              .instructions("Answer in the language of the question.")
              .build())
          .build();
      var channel = client.beta().organization().claudeTag().slackChannels().create(params);

      IO.println(channel.id());
  }
  ```

  ```php PHP
  $client = new Client();

  $channel = $client->beta->organization->claudeTag->slackChannels->create(
      slack: ['teamID' => 'T01ABCD2EFG', 'channelID' => 'C05HJKL6MNP'],
      settings: ['instructions' => 'Answer in the language of the question.'],
  );

  echo "{$channel->id}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  channel = client.beta.organization.claude_tag.slack_channels.create(
    slack: {team_id: "T01ABCD2EFG", channel_id: "C05HJKL6MNP"},
    settings: {instructions: "Answer in the language of the question."}
  )

  puts channel.id
  ```
</CodeGroup>

```json Response
{
  "type": "slack_channel",
  "id": "slch_011CZkZmRt4vNq8sHbYw2KdX",
  "slack": {
    "team_id": "T01ABCD2EFG",
    "channel_id": "C05HJKL6MNP"
  },
  "settings": {
    "enabled": null,
    "instructions": "Answer in the language of the question.",
    "model": null,
    "environment_id": null,
    "guest_policy": null
  },
  "agent_id": "cagt_011CZkZsHz6bTh2vNmEu4QrX",
  "created_at": "2026-10-19T16:20:05Z",
  "updated_at": "2026-10-19T16:20:05Z"
}
```

채널이 설정되기 전에 Claude의 Slack 앱은 채널이 워크스페이스에 있고, 보관되지 않았으며, 앱에 표시되는지 Slack에 확인합니다. 이 확인에 실패한 채널은 `404`를 반환하며, Claude의 Slack 앱이 설치되지 않은 워크스페이스도 마찬가지입니다.

채널 설정과 `settings` 적용은 두 단계입니다. 첫 번째 단계가 성공하고 두 번째 단계가 거부되면, 응답은 거부이며 채널은 아무것도 저장되지 않은 채 설정된 상태로 남습니다. 이 거부에는 `slack_channel_set_up_`으로 시작하는 `error_code`와 `error.details.slack_channel_id`에 새 채널의 `id`가 포함됩니다([오류 응답](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#error-responses) 참조). `settings`를 수정하여 해당 `id`에 대한 [업데이트](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#update-a-channel)로 보내거나, 설정 요청을 다시 보내세요.

### 채널 목록 조회

`GET /v1/organizations/claude_tag/slack_channels`는 한 워크스페이스의 설정된 채널을 `created_at` 기준 최신순으로 나열합니다. `slack_team_id`는 필수이며 워크스페이스에 대한 Slack 자체 ID입니다. `next_page`가 여전히 설정되어 있는 동안에도 한 페이지에 `limit`보다 적은 채널이 있거나 채널이 없을 수 있으므로, `next_page`가 `null`이 될 때까지 계속 페이지를 요청하세요([페이지네이션](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#pagination) 참조). `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels?slack_team_id=T01ABCD2EFG" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels list --slack-team-id T01ABCD2EFG
  ```

  ```python Python
  client = anthropic.Anthropic()

  channels = client.beta.organization.claude_tag.slack_channels.list(
      slack_team_id="T01ABCD2EFG"
  )

  # 필요에 따라 추가 페이지를 자동으로 가져옵니다.
  for channel in channels:
      print(f"{channel.id}: {channel.slack.channel_id}")
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const channels = await client.beta.organization.claudeTag.slackChannels.list({
    slack_team_id: "T01ABCD2EFG"
  });

  for await (const channel of channels) {
    console.log(`${channel.id}: ${channel.slack.channel_id}`);
  }
  ```

  ```csharp C#
  AnthropicClient client = new();

  var page = await client.Beta.Organization.ClaudeTag.SlackChannels.List(
      new() { SlackTeamID = "T01ABCD2EFG" }
  );

  await foreach (var channel in page.Paginate())
  {
      Console.WriteLine($"{channel.ID}: {channel.Slack.ChannelID}");
  }
  ```

  ```go Go
  client := anthropic.NewClient()

  channels := client.Beta.Organization.ClaudeTag.SlackChannels.ListAutoPaging(
  	context.Background(),
  	anthropic.BetaOrganizationClaudeTagSlackChannelListParams{
  		SlackTeamID: "T01ABCD2EFG",
  	},
  )

  for channels.Next() {
  	channel := channels.Current()
  	fmt.Printf("%s: %s\n", channel.ID, channel.Slack.ChannelID)
  }
  if err := channels.Err(); err != nil {
  	log.Fatal(err)
  }
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.slackchannels.SlackChannelListParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = SlackChannelListParams.builder()
          .slackTeamId("T01ABCD2EFG")
          .build();
      var channels = client.beta().organization().claudeTag().slackChannels().list(params);

      for (var channel : channels.autoPager()) {
          IO.println(channel.id() + ": " + channel.slack().channelId());
      }
  }
  ```

  ```php PHP
  $client = new Client();

  $channels = $client->beta->organization->claudeTag->slackChannels->list(
      slackTeamID: 'T01ABCD2EFG',
  );

  // 이 페이지만 해당합니다. 다음 페이지는 page: $channels->nextPage로 list()를 다시 호출하세요.
  foreach ($channels->getItems() as $channel) {
      echo "{$channel->id}: {$channel->slack->channelID}\n";
  }
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  page = client.beta.organization.claude_tag.slack_channels.list(slack_team_id: "T01ABCD2EFG")

  page.auto_paging_each do |channel|
    puts "#{channel.id}: #{channel.slack.channel_id}"
  end
  ```
</CodeGroup>

응답은 `{"data": [...], "next_page": ...}`이며, 각 항목은 채널 객체입니다. 조직이 소유하지 않은 워크스페이스를 가리키는 `slack_team_id`는 `404`를 반환합니다.

### Slack ID로 채널 찾기

채널 하나를 조회하려면 채널에 대한 Slack 자체 ID인 `slack_channel_id`를 추가하세요. `data`에는 해당 채널이 담기며, 채널이 설정되지 않은 경우 비어 있습니다. 조회는 `limit`과 `page`를 무시하며, `next_page`는 `null`입니다. 이것이 채널의 `id`를 찾는 방법입니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels?slack_team_id=T01ABCD2EFG&slack_channel_id=C05HJKL6MNP" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels list \
    --slack-team-id T01ABCD2EFG \
    --slack-channel-id C05HJKL6MNP
  ```

  ```python Python
  client = anthropic.Anthropic()

  page = client.beta.organization.claude_tag.slack_channels.list(
      slack_team_id="T01ABCD2EFG",
      slack_channel_id="C05HJKL6MNP",
  )

  for channel in page.data:
      print(channel.id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const page = await client.beta.organization.claudeTag.slackChannels.list({
    slack_team_id: "T01ABCD2EFG",
    slack_channel_id: "C05HJKL6MNP"
  });

  for (const channel of page.data) {
    console.log(channel.id);
  }
  ```

  ```csharp C#
  AnthropicClient client = new();

  var page = await client.Beta.Organization.ClaudeTag.SlackChannels.List(
      new() { SlackTeamID = "T01ABCD2EFG", SlackChannelID = "C05HJKL6MNP" }
  );

  foreach (var channel in page.Items)
  {
      Console.WriteLine(channel.ID);
  }
  ```

  ```go Go
  client := anthropic.NewClient()

  page, err := client.Beta.Organization.ClaudeTag.SlackChannels.List(
  	context.Background(),
  	anthropic.BetaOrganizationClaudeTagSlackChannelListParams{
  		SlackTeamID:    "T01ABCD2EFG",
  		SlackChannelID: anthropic.String("C05HJKL6MNP"),
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  for _, channel := range page.Data {
  	fmt.Println(channel.ID)
  }
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.slackchannels.SlackChannelListParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = SlackChannelListParams.builder()
          .slackTeamId("T01ABCD2EFG")
          .slackChannelId("C05HJKL6MNP")
          .build();
      var page = client.beta().organization().claudeTag().slackChannels().list(params);

      for (var channel : page.items()) {
          IO.println(channel.id());
      }
  }
  ```

  ```php PHP
  $client = new Client();

  $channels = $client->beta->organization->claudeTag->slackChannels->list(
      slackTeamID: 'T01ABCD2EFG',
      slackChannelID: 'C05HJKL6MNP',
  );

  foreach ($channels->getItems() as $channel) {
      echo "{$channel->id}\n";
  }
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  page = client.beta.organization.claude_tag.slack_channels.list(
    slack_team_id: "T01ABCD2EFG",
    slack_channel_id: "C05HJKL6MNP"
  )

  page.data&.each do |channel|
    puts channel.id
  end
  ```
</CodeGroup>

`slch_` ID를 `slack_channel_id`로 전달하면 `400`을 반환합니다.

### 채널 가져오기

`GET /v1/organizations/claude_tag/slack_channels/{id}`는 채널 객체를 반환합니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels/slch_011CZkZmRt4vNq8sHbYw2KdX" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels retrieve \
    --id slch_011CZkZmRt4vNq8sHbYw2KdX
  ```

  ```python Python
  client = anthropic.Anthropic()

  channel = client.beta.organization.claude_tag.slack_channels.retrieve(
      "slch_011CZkZmRt4vNq8sHbYw2KdX"
  )

  print(channel.settings.enabled)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const channel = await client.beta.organization.claudeTag.slackChannels.retrieve(
    "slch_011CZkZmRt4vNq8sHbYw2KdX"
  );

  console.log(channel.settings.enabled);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var channel = await client.Beta.Organization.ClaudeTag.SlackChannels.Retrieve(
      "slch_011CZkZmRt4vNq8sHbYw2KdX"
  );

  Console.WriteLine(channel.Settings.Enabled);
  ```

  ```go Go
  client := anthropic.NewClient()

  channel, err := client.Beta.Organization.ClaudeTag.SlackChannels.Get(
  	context.Background(),
  	"slch_011CZkZmRt4vNq8sHbYw2KdX",
  	anthropic.BetaOrganizationClaudeTagSlackChannelGetParams{},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(channel.Settings.Enabled)
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var channel = client.beta().organization().claudeTag().slackChannels()
      .retrieve("slch_011CZkZmRt4vNq8sHbYw2KdX");

  IO.println(channel.settings().enabled().orElse(null));
  ```

  ```php PHP
  $client = new Client();

  $channel = $client->beta->organization->claudeTag->slackChannels->retrieve(
      id: 'slch_011CZkZmRt4vNq8sHbYw2KdX',
  );

  echo json_encode($channel->settings->enabled) . "\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  channel_id = "slch_011CZkZmRt4vNq8sHbYw2KdX"
  channel = client.beta.organization.claude_tag.slack_channels.retrieve(channel_id)

  puts channel.settings.enabled
  ```
</CodeGroup>

### 채널 업데이트

`POST /v1/organizations/claude_tag/slack_channels/{id}`는 채널의 설정을 변경하고 채널 객체를 반환합니다. `settings`는 필수이며 [설정 변경](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#changing-settings)을 따릅니다. `write:claude_tag` 범위가 필요합니다.

한 채널에서 Claude를 끄고 나머지 설정은 그대로 둡니다:

<CodeGroup>
  ```bash cURL
  curl -X POST "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels/slch_011CZkZmRt4vNq8sHbYw2KdX" \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28" \
    -d '{"settings": {"enabled": false}}'
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels update \
    --id slch_011CZkZmRt4vNq8sHbYw2KdX \
    --settings '{enabled: false}'
  ```

  ```python Python
  client = anthropic.Anthropic()

  channel = client.beta.organization.claude_tag.slack_channels.update(
      "slch_011CZkZmRt4vNq8sHbYw2KdX",
      settings={"enabled": False},
  )

  print(channel.settings.enabled)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const channel = await client.beta.organization.claudeTag.slackChannels.update(
    "slch_011CZkZmRt4vNq8sHbYw2KdX",
    { settings: { enabled: false } }
  );

  console.log(channel.settings.enabled);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var channel = await client.Beta.Organization.ClaudeTag.SlackChannels.Update(
      "slch_011CZkZmRt4vNq8sHbYw2KdX",
      new() { Settings = new() { Enabled = false } }
  );

  Console.WriteLine(channel.Settings.Enabled);
  ```

  ```go Go
  client := anthropic.NewClient()

  channel, err := client.Beta.Organization.ClaudeTag.SlackChannels.Update(
  	context.Background(),
  	"slch_011CZkZmRt4vNq8sHbYw2KdX",
  	anthropic.BetaOrganizationClaudeTagSlackChannelUpdateParams{
  		Settings: anthropic.BetaClaudeTagSettingsUpdateParam{
  			Enabled: anthropic.Bool(false),
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(channel.Settings.Enabled)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.BetaClaudeTagSettingsUpdate;
  import com.anthropic.models.beta.organization.claudetag.slackchannels.SlackChannelUpdateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = SlackChannelUpdateParams.builder()
          .settings(BetaClaudeTagSettingsUpdate.builder()
              .enabled(false)
              .build())
          .build();
      var channel = client.beta().organization().claudeTag().slackChannels()
          .update("slch_011CZkZmRt4vNq8sHbYw2KdX", params);

      IO.println(channel.settings().enabled().orElse(null));
  }
  ```

  ```php PHP
  $client = new Client();

  $channel = $client->beta->organization->claudeTag->slackChannels->update(
      id: 'slch_011CZkZmRt4vNq8sHbYw2KdX',
      settings: ['enabled' => false],
  );

  echo json_encode($channel->settings->enabled) . "\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  channel_id = "slch_011CZkZmRt4vNq8sHbYw2KdX"
  channel = client.beta.organization.claude_tag.slack_channels.update(
    channel_id,
    settings: {enabled: false}
  )

  puts channel.settings.enabled
  ```
</CodeGroup>

상속된 지침만 적용되도록 채널의 지침을 지웁니다:

<CodeGroup>
  ```bash cURL
  curl -X POST "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels/slch_011CZkZmRt4vNq8sHbYw2KdX" \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28" \
    -d '{"settings": {"instructions": null}}'
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels update \
    --id slch_011CZkZmRt4vNq8sHbYw2KdX \
    --settings '{instructions: null}'
  ```

  ```python Python
  client = anthropic.Anthropic()

  channel = client.beta.organization.claude_tag.slack_channels.update(
      "slch_011CZkZmRt4vNq8sHbYw2KdX",
      settings={"instructions": None},
  )

  print(channel.settings.instructions)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const channel = await client.beta.organization.claudeTag.slackChannels.update(
    "slch_011CZkZmRt4vNq8sHbYw2KdX",
    { settings: { instructions: null } }
  );

  console.log(channel.settings.instructions);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var channel = await client.Beta.Organization.ClaudeTag.SlackChannels.Update(
      "slch_011CZkZmRt4vNq8sHbYw2KdX",
      new() { Settings = new() { Instructions = null } }
  );

  Console.WriteLine(channel.Settings.Instructions);
  ```

  ```go Go
  client := anthropic.NewClient()

  channel, err := client.Beta.Organization.ClaudeTag.SlackChannels.Update(
  	context.Background(),
  	"slch_011CZkZmRt4vNq8sHbYw2KdX",
  	anthropic.BetaOrganizationClaudeTagSlackChannelUpdateParams{
  		Settings: anthropic.BetaClaudeTagSettingsUpdateParam{
  			Instructions: param.Null[string](),
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(channel.Settings.Instructions)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.BetaClaudeTagSettingsUpdate;
  import com.anthropic.models.beta.organization.claudetag.slackchannels.SlackChannelUpdateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = SlackChannelUpdateParams.builder()
          .settings(BetaClaudeTagSettingsUpdate.builder()
              .instructions(Optional.empty())
              .build())
          .build();
      var channel = client.beta().organization().claudeTag().slackChannels()
          .update("slch_011CZkZmRt4vNq8sHbYw2KdX", params);

      IO.println(channel.settings().instructions().orElse(null));
  }
  ```

  ```php PHP
  use Anthropic\Beta\Organization\ClaudeTag\ClaudeTagSettingsUpdate;
  // ...

  $client = new Client();

  // update()는 배열 내부의 null을 제거하므로, null을 보내려면 settings 객체를 직접 구성하세요.
  $channel = $client->beta->organization->claudeTag->slackChannels->update(
      id: 'slch_011CZkZmRt4vNq8sHbYw2KdX',
      settings: (new ClaudeTagSettingsUpdate())->withInstructions(null),
  );

  echo "{$channel->settings->instructions}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  channel_id = "slch_011CZkZmRt4vNq8sHbYw2KdX"
  channel = client.beta.organization.claude_tag.slack_channels.update(
    channel_id,
    settings: {instructions: nil}
  )

  puts channel.settings.instructions
  ```
</CodeGroup>

### 채널의 유효 설정 가져오기

`GET /v1/organizations/claude_tag/slack_channels/{id}/effective`는 채널에 적용되는 내용과 각 값의 출처를 반환합니다. [저장된 설정과 유효 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#stored-and-effective-settings)에서 전체 응답을 확인할 수 있습니다. 이 뷰에서 `enabled`와 `guest_policy`는 절대 `null`이 아닙니다. 이 뷰는 읽을 때마다 결정되므로 `created_at`이나 `updated_at`이 없습니다. 어떤 수준을 읽을 수 없는 경우, 해당 수준 없이 결정하는 대신 요청이 `503`으로 실패합니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels/slch_011CZkZmRt4vNq8sHbYw2KdX/effective" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels:effective retrieve \
    --id slch_011CZkZmRt4vNq8sHbYw2KdX
  ```

  ```python Python
  client = anthropic.Anthropic()

  effective = client.beta.organization.claude_tag.slack_channels.effective.retrieve(
      "slch_011CZkZmRt4vNq8sHbYw2KdX"
  )

  print(effective.settings.instructions)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const effective = await client.beta.organization.claudeTag.slackChannels.effective.retrieve(
    "slch_011CZkZmRt4vNq8sHbYw2KdX"
  );

  console.log(effective.settings.instructions);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var effective = await client.Beta.Organization.ClaudeTag.SlackChannels.Effective.Retrieve(
      "slch_011CZkZmRt4vNq8sHbYw2KdX"
  );

  Console.WriteLine(effective.Settings.Instructions);
  ```

  ```go Go
  client := anthropic.NewClient()

  effective, err := client.Beta.Organization.ClaudeTag.SlackChannels.Effective.Get(
  	context.Background(),
  	"slch_011CZkZmRt4vNq8sHbYw2KdX",
  	anthropic.BetaOrganizationClaudeTagSlackChannelEffectiveGetParams{},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(effective.Settings.Instructions)
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var effective = client.beta().organization().claudeTag().slackChannels().effective()
      .retrieve("slch_011CZkZmRt4vNq8sHbYw2KdX");

  IO.println(effective.settings().instructions().orElse(null));
  ```

  ```php PHP
  $client = new Client();

  $effective = $client->beta->organization->claudeTag->slackChannels->effective->retrieve(
      id: 'slch_011CZkZmRt4vNq8sHbYw2KdX',
  );

  echo "{$effective->settings->instructions}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  channel_id = "slch_011CZkZmRt4vNq8sHbYw2KdX"
  effective = client.beta.organization.claude_tag.slack_channels.effective.retrieve(channel_id)

  puts effective.settings.instructions
  ```
</CodeGroup>

### 채널 제거

`DELETE /v1/organizations/claude_tag/slack_channels/{id}`는 Claude Tag에서 채널을 제거합니다. 이는 조직 소유자가 claude.ai에서 수행하는 제거와 동일하며 효과도 같습니다. Slack의 채널이나 그 안의 메시지를 삭제, 보관 또는 변경하지 않습니다. `write:claude_tag` 범위가 필요합니다.

<Warning>
  제거는 되돌릴 수 없습니다. Claude Tag가 해당 채널에 대해 보유한 다음 항목이 삭제됩니다:

  * 저장된 설정과 Bundle 대상
  * 세션과 그 트랜스크립트(실행 중인 세션 포함)
  * 메모리, 즉 Claude가 세션 간에 채널에 대해 유지하는 정보
  * 루틴과 채널에서 게시된 아티팩트
</Warning>

<CodeGroup>
  ```bash cURL
  curl -X DELETE "https://api.anthropic.com/v1/organizations/claude_tag/slack_channels/slch_011CZkZmRt4vNq8sHbYw2KdX" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-channels delete \
    --id slch_011CZkZmRt4vNq8sHbYw2KdX
  ```

  ```python Python
  client = anthropic.Anthropic()

  deleted_channel = client.beta.organization.claude_tag.slack_channels.delete(
      "slch_011CZkZmRt4vNq8sHbYw2KdX"
  )

  print(deleted_channel.id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const deletedChannel = await client.beta.organization.claudeTag.slackChannels.delete(
    "slch_011CZkZmRt4vNq8sHbYw2KdX"
  );

  console.log(deletedChannel.id);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var deletedChannel = await client.Beta.Organization.ClaudeTag.SlackChannels.Delete(
      "slch_011CZkZmRt4vNq8sHbYw2KdX"
  );

  Console.WriteLine(deletedChannel.ID);
  ```

  ```go Go
  client := anthropic.NewClient()

  deletedChannel, err := client.Beta.Organization.ClaudeTag.SlackChannels.Delete(
  	context.Background(),
  	"slch_011CZkZmRt4vNq8sHbYw2KdX",
  	anthropic.BetaOrganizationClaudeTagSlackChannelDeleteParams{},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(deletedChannel.ID)
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var deletedChannel = client.beta().organization().claudeTag().slackChannels()
      .delete("slch_011CZkZmRt4vNq8sHbYw2KdX");

  IO.println(deletedChannel.id());
  ```

  ```php PHP
  $client = new Client();

  $deletedChannel = $client->beta->organization->claudeTag->slackChannels->delete(
      id: 'slch_011CZkZmRt4vNq8sHbYw2KdX',
  );

  echo "{$deletedChannel->id}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  channel_id = "slch_011CZkZmRt4vNq8sHbYw2KdX"
  deleted_channel = client.beta.organization.claude_tag.slack_channels.delete(channel_id)

  puts deleted_channel.id
  ```
</CodeGroup>

```json Response
{
  "type": "slack_channel_deleted",
  "id": "slch_011CZkZmRt4vNq8sHbYw2KdX"
}
```

요청이 반환되는 즉시 해당 `id`는 `404`를 반환하며, 나머지는 백그라운드에서 삭제됩니다. 제거를 반복하면 `404`가 반환됩니다.

**채널을 제거해도 해당 채널에서 Claude가 중지되지 않습니다.** Claude는 채널이 상속하는 설정에 따라 채널에 대한 메모리 없이 계속 답변하며, 다음 사용 시 새 `id`로 채널이 다시 설정될 수 있습니다.

* 채널에서 Claude의 답변을 중지하려면 대신 해당 채널의 `enabled`를 `false`로 설정하세요.
* 채널이 아무것도 저장하지 않으면서 세션과 메모리는 유지하도록 하려면 대신 각 설정을 지우고 각 Bundle을 분리하세요.

두 종류의 채널은 여기서 제거할 수 없으며 `400`을 반환합니다: [구성](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#configured-levels)되지 않은 채널(`error_code: "slack_channel_not_configured"`), 그리고 러너 풀이나 claude.ai에만 있는 설정처럼 이 API가 관리하지 않는 구성을 보유한 채널입니다. 두 번째 종류는 조직 소유자가 claude.ai에서 제거합니다.

## Slack 워크스페이스

워크스페이스 객체는 하나의 Slack 워크스페이스에 대한 저장된 뷰입니다. `type`이 `slack_workspace`이고, `id`에 `slws_` 접두사가 붙으며, `slack`이 `team_id`만 보유한다는 점을 제외하면 [채널 객체](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#slack-channels)와 동일한 필드를 가집니다. [빠른 시작](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#quick-start) 응답에서 전체 객체를 확인할 수 있습니다.

`slws_` 접두사가 없는 `id`는 `400`을 반환합니다. 접두사는 있지만 조직의 어떤 워크스페이스도 가리키지 않는 `id`는 `404`를 반환합니다.

### 워크스페이스 목록 조회

`GET /v1/organizations/claude_tag/slack_workspaces`는 조직이 소유한 설정된 워크스페이스를 `created_at` 기준 최신순으로 나열합니다. [빠른 시작](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#quick-start)에서 요청과 응답을 확인할 수 있습니다. Slack 자체 ID로 워크스페이스 하나를 찾으려면 `slack_team_id`를 추가하세요. `data`에는 해당 워크스페이스가 담기며, 워크스페이스가 설정되지 않은 경우 비어 있습니다. 조직이 소유하지 않은 워크스페이스는 `404`를 반환합니다. `read:claude_tag` 범위가 필요합니다.

### 워크스페이스 가져오기

`GET /v1/organizations/claude_tag/slack_workspaces/{id}`는 워크스페이스 객체를 반환합니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_workspaces/slws_011CZkZnWa7xPc3uJfZe5LgT" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-workspaces retrieve \
    --id slws_011CZkZnWa7xPc3uJfZe5LgT
  ```

  ```python Python
  client = anthropic.Anthropic()

  workspace = client.beta.organization.claude_tag.slack_workspaces.retrieve(
      "slws_011CZkZnWa7xPc3uJfZe5LgT"
  )

  print(workspace.settings.instructions)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const workspace = await client.beta.organization.claudeTag.slackWorkspaces.retrieve(
    "slws_011CZkZnWa7xPc3uJfZe5LgT"
  );

  console.log(workspace.settings.instructions);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var workspace = await client.Beta.Organization.ClaudeTag.SlackWorkspaces.Retrieve(
      "slws_011CZkZnWa7xPc3uJfZe5LgT"
  );

  Console.WriteLine(workspace.Settings.Instructions);
  ```

  ```go Go
  client := anthropic.NewClient()

  workspace, err := client.Beta.Organization.ClaudeTag.SlackWorkspaces.Get(
  	context.Background(),
  	"slws_011CZkZnWa7xPc3uJfZe5LgT",
  	anthropic.BetaOrganizationClaudeTagSlackWorkspaceGetParams{},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(workspace.Settings.Instructions)
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var workspace = client.beta().organization().claudeTag().slackWorkspaces()
      .retrieve("slws_011CZkZnWa7xPc3uJfZe5LgT");

  IO.println(workspace.settings().instructions().orElse(null));
  ```

  ```php PHP
  $client = new Client();

  $workspace = $client->beta->organization->claudeTag->slackWorkspaces->retrieve(
      id: 'slws_011CZkZnWa7xPc3uJfZe5LgT',
  );

  echo "{$workspace->settings->instructions}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  workspace_id = "slws_011CZkZnWa7xPc3uJfZe5LgT"
  workspace = client.beta.organization.claude_tag.slack_workspaces.retrieve(workspace_id)

  puts workspace.settings.instructions
  ```
</CodeGroup>

### 워크스페이스 업데이트

`POST /v1/organizations/claude_tag/slack_workspaces/{id}`는 워크스페이스의 설정을 변경하고 워크스페이스 객체를 반환합니다. `settings`는 필수이며 [설정 변경](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#changing-settings)을 따릅니다. 여기서 설정한 값은 워크스페이스에서 자체 값을 설정하지 않은 모든 채널에 적용됩니다. `write:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl -X POST "https://api.anthropic.com/v1/organizations/claude_tag/slack_workspaces/slws_011CZkZnWa7xPc3uJfZe5LgT" \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28" \
    -d '{"settings": {"guest_policy": {"type": "restrict"}}}'
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-workspaces update \
    --id slws_011CZkZnWa7xPc3uJfZe5LgT \
    --settings '{guest_policy: {type: restrict}}'
  ```

  ```python Python
  client = anthropic.Anthropic()

  workspace = client.beta.organization.claude_tag.slack_workspaces.update(
      "slws_011CZkZnWa7xPc3uJfZe5LgT",
      settings={"guest_policy": {"type": "restrict"}},
  )

  print(workspace.settings.guest_policy)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const workspace = await client.beta.organization.claudeTag.slackWorkspaces.update(
    "slws_011CZkZnWa7xPc3uJfZe5LgT",
    { settings: { guest_policy: { type: "restrict" } } }
  );

  console.log(workspace.settings.guest_policy?.type);
  ```

  ```csharp C#
  using Anthropic.Models.Beta.Organization.ClaudeTag;

  AnthropicClient client = new();

  var workspace = await client.Beta.Organization.ClaudeTag.SlackWorkspaces.Update(
      "slws_011CZkZnWa7xPc3uJfZe5LgT",
      new() { Settings = new() { GuestPolicy = new BetaClaudeTagGuestPolicyRestrict() } }
  );

  Console.WriteLine(workspace.Settings.GuestPolicy?.Type.GetString());
  ```

  ```go Go
  client := anthropic.NewClient()

  workspace, err := client.Beta.Organization.ClaudeTag.SlackWorkspaces.Update(
  	context.Background(),
  	"slws_011CZkZnWa7xPc3uJfZe5LgT",
  	anthropic.BetaOrganizationClaudeTagSlackWorkspaceUpdateParams{
  		Settings: anthropic.BetaClaudeTagSettingsUpdateParam{
  			GuestPolicy: anthropic.BetaClaudeTagGuestPolicyUnionParam{
  				OfRestrict: &anthropic.BetaClaudeTagGuestPolicyRestrictParam{},
  			},
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(workspace.Settings.GuestPolicy.Type)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.BetaClaudeTagGuestPolicyRestrict;
  import com.anthropic.models.beta.organization.claudetag.BetaClaudeTagSettingsUpdate;
  import com.anthropic.models.beta.organization.claudetag.slackworkspaces.SlackWorkspaceUpdateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = SlackWorkspaceUpdateParams.builder()
          .settings(BetaClaudeTagSettingsUpdate.builder()
              .guestPolicy(BetaClaudeTagGuestPolicyRestrict.builder().build())
              .build())
          .build();
      var workspace = client.beta().organization().claudeTag().slackWorkspaces()
          .update("slws_011CZkZnWa7xPc3uJfZe5LgT", params);

      IO.println(workspace.settings().guestPolicy().map(policy -> policy.type().asString()).orElse(null));
  }
  ```

  ```php PHP
  $client = new Client();

  $workspace = $client->beta->organization->claudeTag->slackWorkspaces->update(
      id: 'slws_011CZkZnWa7xPc3uJfZe5LgT',
      settings: ['guestPolicy' => ['type' => 'restrict']],
  );

  echo "{$workspace->settings->guestPolicy?->type}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  workspace_id = "slws_011CZkZnWa7xPc3uJfZe5LgT"
  workspace = client.beta.organization.claude_tag.slack_workspaces.update(
    workspace_id,
    settings: {guest_policy: {type: :restrict}}
  )

  puts workspace.settings.guest_policy&.type
  ```
</CodeGroup>

### 워크스페이스의 유효 설정 가져오기

`GET /v1/organizations/claude_tag/slack_workspaces/{id}/effective`는 워크스페이스와 Slack 기본값으로부터 결정된, 워크스페이스에 적용되는 내용을 [저장된 설정과 유효 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#stored-and-effective-settings)에 나온 형태로 반환하며, `type`은 `slack_workspace_effective`로 설정됩니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_workspaces/slws_011CZkZnWa7xPc3uJfZe5LgT/effective" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-workspaces:effective retrieve \
    --id slws_011CZkZnWa7xPc3uJfZe5LgT
  ```

  ```python Python
  client = anthropic.Anthropic()

  effective = client.beta.organization.claude_tag.slack_workspaces.effective.retrieve(
      "slws_011CZkZnWa7xPc3uJfZe5LgT"
  )

  print(effective.settings.enabled)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const effective = await client.beta.organization.claudeTag.slackWorkspaces.effective.retrieve(
    "slws_011CZkZnWa7xPc3uJfZe5LgT"
  );

  console.log(effective.settings.enabled);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var effective = await client.Beta.Organization.ClaudeTag.SlackWorkspaces.Effective.Retrieve(
      "slws_011CZkZnWa7xPc3uJfZe5LgT"
  );

  Console.WriteLine(effective.Settings.Enabled);
  ```

  ```go Go
  client := anthropic.NewClient()

  effective, err := client.Beta.Organization.ClaudeTag.SlackWorkspaces.Effective.Get(
  	context.Background(),
  	"slws_011CZkZnWa7xPc3uJfZe5LgT",
  	anthropic.BetaOrganizationClaudeTagSlackWorkspaceEffectiveGetParams{},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(effective.Settings.Enabled)
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var effective = client.beta().organization().claudeTag().slackWorkspaces().effective()
      .retrieve("slws_011CZkZnWa7xPc3uJfZe5LgT");

  IO.println(effective.settings().enabled().orElse(null));
  ```

  ```php PHP
  $client = new Client();

  $effective = $client->beta->organization->claudeTag->slackWorkspaces->effective->retrieve(
      id: 'slws_011CZkZnWa7xPc3uJfZe5LgT',
  );

  echo json_encode($effective->settings->enabled) . "\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  workspace_id = "slws_011CZkZnWa7xPc3uJfZe5LgT"
  effective = client.beta.organization.claude_tag.slack_workspaces.effective.retrieve(workspace_id)

  puts effective.settings.enabled
  ```
</CodeGroup>

## Slack 기본값

조직에는 정확히 하나의 Slack 기본값 객체가 있습니다. 이 객체는 모든 워크스페이스와 채널에 적용되며, `id`가 없고, 더 넓은 수준이 없으므로 유효 뷰도 없습니다.

| 필드         | 설명                                                                                                                                                  |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `type`     | `slack_defaults`.                                                                                                                                   |
| `settings` | [채널](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#slack-channels)에서와 같이 기본값이 저장하는 내용입니다.                                        |
| `agent_id` | `cagt_` 접두사가 붙습니다. Slack 기본값이 [설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#set-up-channels-and-workspaces)될 때까지 `null`입니다. |

### Slack 기본값 가져오기

`GET /v1/organizations/claude_tag/slack_defaults`는 객체를 반환합니다. Slack 기본값이 설정되지 않은 조직은 모든 설정과 `agent_id`가 `null`인 `200`을 받습니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/slack_defaults" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-defaults retrieve
  ```

  ```python Python
  client = anthropic.Anthropic()

  defaults = client.beta.organization.claude_tag.slack_defaults.retrieve()

  print(defaults.settings.guest_policy)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const defaults = await client.beta.organization.claudeTag.slackDefaults.retrieve();

  console.log(defaults.settings.guest_policy?.type);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var defaults = await client.Beta.Organization.ClaudeTag.SlackDefaults.Retrieve();

  Console.WriteLine(defaults.Settings.GuestPolicy?.Type.GetString());
  ```

  ```go Go
  client := anthropic.NewClient()

  defaults, err := client.Beta.Organization.ClaudeTag.SlackDefaults.Get(
  	context.Background(),
  	anthropic.BetaOrganizationClaudeTagSlackDefaultGetParams{},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(defaults.Settings.GuestPolicy.Type)
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var defaults = client.beta().organization().claudeTag().slackDefaults().retrieve();

  IO.println(defaults.settings().guestPolicy().map(policy -> policy.type().asString()).orElse(null));
  ```

  ```php PHP
  $client = new Client();

  $defaults = $client->beta->organization->claudeTag->slackDefaults->retrieve();

  echo "{$defaults->settings->guestPolicy?->type}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  defaults = client.beta.organization.claude_tag.slack_defaults.retrieve

  puts defaults.settings.guest_policy&.type
  ```
</CodeGroup>

### Slack 기본값 업데이트

`POST /v1/organizations/claude_tag/slack_defaults`는 기본값을 변경하고 객체를 반환합니다. `settings`는 필수이며 [설정 변경](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#changing-settings)을 따릅니다. Slack 기본값이 설정되지 않은 상태에서 값을 설정하는 요청은 `400`을 반환합니다. `write:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl -X POST "https://api.anthropic.com/v1/organizations/claude_tag/slack_defaults" \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28" \
    -d '{
      "settings": {
        "instructions": "Keep replies under 200 words.",
        "environment_id": "env_011CZkZqDx2zRf5tLjCs7NpV"
      }
    }'
  ```

  ```bash CLI
  ant beta:organization:claude-tag:slack-defaults update \
    --settings '{instructions: "Keep replies under 200 words.", environment_id: env_011CZkZqDx2zRf5tLjCs7NpV}'
  ```

  ```python Python
  client = anthropic.Anthropic()

  defaults = client.beta.organization.claude_tag.slack_defaults.update(
      settings={
          "instructions": "Keep replies under 200 words.",
          "environment_id": "env_011CZkZqDx2zRf5tLjCs7NpV",
      },
  )

  print(defaults.settings.environment_id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const defaults = await client.beta.organization.claudeTag.slackDefaults.update({
    settings: {
      instructions: "Keep replies under 200 words.",
      environment_id: "env_011CZkZqDx2zRf5tLjCs7NpV"
    }
  });

  console.log(defaults.settings.environment_id);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var defaults = await client.Beta.Organization.ClaudeTag.SlackDefaults.Update(
      new()
      {
          Settings = new()
          {
              Instructions = "Keep replies under 200 words.",
              EnvironmentID = "env_011CZkZqDx2zRf5tLjCs7NpV",
          },
      }
  );

  Console.WriteLine(defaults.Settings.EnvironmentID);
  ```

  ```go Go
  client := anthropic.NewClient()

  defaults, err := client.Beta.Organization.ClaudeTag.SlackDefaults.Update(
  	context.Background(),
  	anthropic.BetaOrganizationClaudeTagSlackDefaultUpdateParams{
  		Settings: anthropic.BetaClaudeTagSettingsUpdateParam{
  			Instructions:  anthropic.String("Keep replies under 200 words."),
  			EnvironmentID: anthropic.String("env_011CZkZqDx2zRf5tLjCs7NpV"),
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(defaults.Settings.EnvironmentID)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.BetaClaudeTagSettingsUpdate;
  import com.anthropic.models.beta.organization.claudetag.slackdefaults.SlackDefaultUpdateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = SlackDefaultUpdateParams.builder()
          .settings(BetaClaudeTagSettingsUpdate.builder()
              .instructions("Keep replies under 200 words.")
              .environmentId("env_011CZkZqDx2zRf5tLjCs7NpV")
              .build())
          .build();
      var defaults = client.beta().organization().claudeTag().slackDefaults().update(params);

      IO.println(defaults.settings().environmentId().orElse(null));
  }
  ```

  ```php PHP
  $client = new Client();

  $defaults = $client->beta->organization->claudeTag->slackDefaults->update(
      settings: [
          'instructions' => 'Keep replies under 200 words.',
          'environmentID' => 'env_011CZkZqDx2zRf5tLjCs7NpV',
      ],
  );

  echo "{$defaults->settings->environmentID}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  defaults = client.beta.organization.claude_tag.slack_defaults.update(
    settings: {
      instructions: "Keep replies under 200 words.",
      environment_id: "env_011CZkZqDx2zRf5tLjCs7NpV"
    }
  )

  puts defaults.settings.environment_id
  ```
</CodeGroup>

```json Response
{
  "type": "slack_defaults",
  "settings": {
    "enabled": null,
    "instructions": "Keep replies under 200 words.",
    "model": null,
    "environment_id": "env_011CZkZqDx2zRf5tLjCs7NpV",
    "guest_policy": null
  },
  "agent_id": "cagt_011CZkZtKa8cUj4wPnFv6RsY"
}
```

## Bundle

Bundle은 claude.ai에서 [Access bundle](https://claude.com/docs/claude-tag/admins/add-connections)이라고 부르는 것으로, Claude가 채널이나 워크스페이스에서 사용할 수 있는 커넥터, 리포지토리, 자격 증명 등의 이름이 지정된 액세스 집합입니다. 조직 소유자는 claude.ai에서 Bundle을 생성, 편집, 삭제합니다. 이 API는 Bundle을 나열하고 연결합니다. Bundle의 이름과 설명을 반환하며, Bundle이 부여하는 내용은 절대 반환하지 않습니다.

| 필드                         | 설명                               |
| -------------------------- | -------------------------------- |
| `type`                     | `bundle`.                        |
| `id`                       | `capp_` 접두사가 붙습니다.               |
| `display_name`             | Bundle의 이름입니다.                   |
| `description`              | Bundle의 용도입니다. 없으면 `null`입니다.    |
| `created_at`, `updated_at` | Bundle이 생성된 시점과 마지막으로 변경된 시점입니다. |

`capp_` 접두사가 없는 `bundle_id`는 `400`을 반환합니다. 접두사가 있지만 존재하지 않거나 다른 조직에 속한 경우, 요청에 다른 내용이 무엇이든 `404`를 반환합니다. Claude Tag가 자체적으로 관리하는 Bundle은 나열되지 않으며 `404`를 반환합니다.

### Bundle 목록 조회

`GET /v1/organizations/claude_tag/bundles`는 조직의 Bundle을 `created_at` 기준 최신순으로 나열합니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/bundles" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:bundles list
  ```

  ```python Python
  client = anthropic.Anthropic()

  bundles = client.beta.organization.claude_tag.bundles.list()

  # 필요에 따라 추가 페이지를 자동으로 가져옵니다.
  for bundle in bundles:
      print(f"{bundle.id}: {bundle.display_name}")
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const bundles = await client.beta.organization.claudeTag.bundles.list();

  for await (const bundle of bundles) {
    console.log(`${bundle.id}: ${bundle.display_name}`);
  }
  ```

  ```csharp C#
  AnthropicClient client = new();

  var page = await client.Beta.Organization.ClaudeTag.Bundles.List();

  await foreach (var bundle in page.Paginate())
  {
      Console.WriteLine($"{bundle.ID}: {bundle.DisplayName}");
  }
  ```

  ```go Go
  client := anthropic.NewClient()

  bundles := client.Beta.Organization.ClaudeTag.Bundles.ListAutoPaging(
  	context.Background(),
  	anthropic.BetaOrganizationClaudeTagBundleListParams{},
  )

  for bundles.Next() {
  	bundle := bundles.Current()
  	fmt.Printf("%s: %s\n", bundle.ID, bundle.DisplayName)
  }
  if err := bundles.Err(); err != nil {
  	log.Fatal(err)
  }
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var bundles = client.beta().organization().claudeTag().bundles().list();

  for (var bundle : bundles.autoPager()) {
      IO.println(bundle.id() + ": " + bundle.displayName());
  }
  ```

  ```php PHP
  $client = new Client();

  $bundles = $client->beta->organization->claudeTag->bundles->list();

  // 이 페이지만 해당합니다. 다음 페이지는 page: $bundles->nextPage로 list()를 다시 호출하세요.
  foreach ($bundles->getItems() as $bundle) {
      echo "{$bundle->id}: {$bundle->displayName}\n";
  }
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  page = client.beta.organization.claude_tag.bundles.list

  page.auto_paging_each do |bundle|
    puts "#{bundle.id}: #{bundle.display_name}"
  end
  ```
</CodeGroup>

```json Response
{
  "data": [
    {
      "type": "bundle",
      "id": "capp_011CZkZjLP1cWxj5EtMmdgbq",
      "display_name": "Support tools",
      "description": "Issue tracker and the support runbooks repository.",
      "created_at": "2026-09-12T08:15:30Z",
      "updated_at": "2026-09-30T13:02:47Z"
    }
  ],
  "next_page": null
}
```

### Bundle 가져오기

`GET /v1/organizations/claude_tag/bundles/{bundle_id}`는 Bundle 객체를 반환합니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/bundles/capp_011CZkZjLP1cWxj5EtMmdgbq" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:bundles retrieve \
    --bundle-id capp_011CZkZjLP1cWxj5EtMmdgbq
  ```

  ```python Python
  client = anthropic.Anthropic()

  bundle = client.beta.organization.claude_tag.bundles.retrieve(
      "capp_011CZkZjLP1cWxj5EtMmdgbq"
  )

  print(bundle.display_name)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const bundle = await client.beta.organization.claudeTag.bundles.retrieve(
    "capp_011CZkZjLP1cWxj5EtMmdgbq"
  );

  console.log(bundle.display_name);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var bundle = await client.Beta.Organization.ClaudeTag.Bundles.Retrieve(
      "capp_011CZkZjLP1cWxj5EtMmdgbq"
  );

  Console.WriteLine(bundle.DisplayName);
  ```

  ```go Go
  client := anthropic.NewClient()

  bundle, err := client.Beta.Organization.ClaudeTag.Bundles.Get(
  	context.Background(),
  	"capp_011CZkZjLP1cWxj5EtMmdgbq",
  	anthropic.BetaOrganizationClaudeTagBundleGetParams{},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(bundle.DisplayName)
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var bundle = client.beta().organization().claudeTag().bundles()
      .retrieve("capp_011CZkZjLP1cWxj5EtMmdgbq");

  IO.println(bundle.displayName());
  ```

  ```php PHP
  $client = new Client();

  $bundle = $client->beta->organization->claudeTag->bundles->retrieve(
      bundleID: 'capp_011CZkZjLP1cWxj5EtMmdgbq',
  );

  echo "{$bundle->displayName}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  bundle_id = "capp_011CZkZjLP1cWxj5EtMmdgbq"
  bundle = client.beta.organization.claude_tag.bundles.retrieve(bundle_id)

  puts bundle.display_name
  ```
</CodeGroup>

## Bundle 대상

Bundle 대상은 하나의 Bundle이 하나의 채널 또는 하나의 워크스페이스에 연결되었음을 나타내는 레코드입니다. 워크스페이스에 연결된 Bundle은 해당 워크스페이스와 그 안의 모든 채널에서 사용할 수 있습니다. 채널에 연결된 Bundle은 해당 채널에서만 사용할 수 있습니다.

| 필드                   | 설명                                                                     |
| -------------------- | ---------------------------------------------------------------------- |
| `type`               | `slack_channel` 또는 `slack_workspace`.                                  |
| `id`                 | `btgt_` 접두사가 붙습니다. 경로의 `{target_id}`이며, 채널이나 워크스페이스 자체의 `id`는 절대 아닙니다. |
| `slack_channel_id`   | `slack_channel` 대상의 경우: `slch_` 접두사가 붙은 채널의 `id`입니다.                   |
| `slack_workspace_id` | `slack_workspace` 대상의 경우: `slws_` 접두사가 붙은 워크스페이스의 `id`입니다.             |
| `created_at`         | Bundle이 연결된 시점입니다.                                                     |

Bundle은 채널이나 워크스페이스에 최대 한 번만 연결되며, 같은 쌍은 분리 후 다시 연결하더라도 항상 같은 `id`를 가집니다. `id`는 불투명한 값입니다. 연결 요청의 응답이나 목록에서 가져오세요. Bundle 대상은 해당 Bundle의 `id`를 보유하지 않지만 경로에는 이것도 필요하므로, 두 값을 함께 보관하세요.

채널이나 워크스페이스에 처음 연결된 Bundle은 해당 채널이나 워크스페이스를 [구성된](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#configured-levels) 상태로 만듭니다. 연결이나 분리는 저장된 설정을 변경하지 않습니다. 채널이나 워크스페이스에서 실행 중인 세션에는 액세스가 변경되었다는 사실이 전달됩니다.

claude.ai가 온콜 설정의 일부로 연결하는 Bundle은 나열되고 읽을 수 있지만 여기서 연결하거나 분리할 수 없으며, 온콜 설정이 관리하는 채널이나 워크스페이스에는 어떤 것도 연결하거나 분리할 수 없습니다. 이러한 요청은 각각 `400`을 반환합니다.

### Bundle의 대상 목록 조회

`GET /v1/organizations/claude_tag/bundles/{bundle_id}/targets`는 Bundle이 연결된 채널과 워크스페이스를 `created_at` 기준 최신순으로 나열합니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/bundles/capp_011CZkZjLP1cWxj5EtMmdgbq/targets" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:bundles:targets list \
    --bundle-id capp_011CZkZjLP1cWxj5EtMmdgbq
  ```

  ```python Python
  client = anthropic.Anthropic()

  targets = client.beta.organization.claude_tag.bundles.targets.list(
      "capp_011CZkZjLP1cWxj5EtMmdgbq"
  )

  # 필요에 따라 추가 페이지를 자동으로 가져옵니다.
  for target in targets:
      print(f"{target.id}: {target.type}")
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const targets = await client.beta.organization.claudeTag.bundles.targets.list(
    "capp_011CZkZjLP1cWxj5EtMmdgbq"
  );

  for await (const target of targets) {
    console.log(`${target.id}: ${target.type}`);
  }
  ```

  ```csharp C#
  AnthropicClient client = new();

  var page = await client.Beta.Organization.ClaudeTag.Bundles.Targets.List(
      "capp_011CZkZjLP1cWxj5EtMmdgbq"
  );

  await foreach (var target in page.Paginate())
  {
      Console.WriteLine($"{target.ID}: {target.Type.GetString()}");
  }
  ```

  ```go Go
  client := anthropic.NewClient()

  targets := client.Beta.Organization.ClaudeTag.Bundles.Targets.ListAutoPaging(
  	context.Background(),
  	"capp_011CZkZjLP1cWxj5EtMmdgbq",
  	anthropic.BetaOrganizationClaudeTagBundleTargetListParams{},
  )

  for targets.Next() {
  	target := targets.Current()
  	fmt.Printf("%s: %s\n", target.ID, target.Type)
  }
  if err := targets.Err(); err != nil {
  	log.Fatal(err)
  }
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  var targets = client.beta().organization().claudeTag().bundles().targets()
      .list("capp_011CZkZjLP1cWxj5EtMmdgbq");

  for (var target : targets.autoPager()) {
      IO.println(target.id() + ": " + target.type().asString());
  }
  ```

  ```php PHP
  $client = new Client();

  $targets = $client->beta->organization->claudeTag->bundles->targets->list(
      bundleID: 'capp_011CZkZjLP1cWxj5EtMmdgbq',
  );

  // 이 페이지만 해당합니다. 다음 페이지는 page: $targets->nextPage로 list()를 다시 호출하세요.
  foreach ($targets->getItems() as $target) {
      echo "{$target->id}: {$target->type}\n";
  }
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  bundle_id = "capp_011CZkZjLP1cWxj5EtMmdgbq"
  page = client.beta.organization.claude_tag.bundles.targets.list(bundle_id)

  page.auto_paging_each do |target|
    puts "#{target.id}: #{target.type}"
  end
  ```
</CodeGroup>

```json Response
{
  "data": [
    {
      "type": "slack_channel",
      "id": "btgt_011CZkZpBv9yQd6wKhAr8MnU",
      "slack_channel_id": "slch_011CZkZmRt4vNq8sHbYw2KdX",
      "created_at": "2026-10-19T16:21:44Z"
    },
    {
      "type": "slack_workspace",
      "id": "btgt_011CZkZuMc3dVk7xQpGw9StZ",
      "slack_workspace_id": "slws_011CZkZnWa7xPc3uJfZe5LgT",
      "created_at": "2026-09-12T08:17:02Z"
    }
  ],
  "next_page": null
}
```

채널과 워크스페이스에 대한 연결만 나열됩니다. claude.ai에서 **Default Slack access**와 같은 다른 대상에 연결된 Bundle에는 그에 대한 Bundle 대상이 없으며, 여러 채널에 한 번에 Bundle을 적용하는 규칙도 마찬가지입니다. 따라서 Claude가 채널에서 사용할 수 있는 Bundle은 해당 채널을 지정하는 대상보다 많을 수 있습니다. 하나의 채널이나 워크스페이스에 연결된 Bundle을 나열하는 엔드포인트는 없습니다.

### Bundle 연결

`POST /v1/organizations/claude_tag/bundles/{bundle_id}/targets`는 Bundle을 연결하고 Bundle 대상을 반환합니다. 본문에는 `type`과 그에 맞는 `id`를 지정합니다. 채널이나 워크스페이스는 이미 설정되어 있어야 합니다. 연결은 절대 채널을 설정하지 않습니다. 이미 연결된 쌍을 연결하면 기존 Bundle 대상과 함께 `200`이 반환됩니다. `write:claude_tag` 범위가 필요합니다.

채널에 Bundle을 연결합니다:

<CodeGroup>
  ```bash cURL
  curl -X POST "https://api.anthropic.com/v1/organizations/claude_tag/bundles/capp_011CZkZjLP1cWxj5EtMmdgbq/targets" \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28" \
    -d '{"type": "slack_channel", "slack_channel_id": "slch_011CZkZmRt4vNq8sHbYw2KdX"}'
  ```

  ```bash CLI
  ant beta:organization:claude-tag:bundles:targets create \
    --bundle-id capp_011CZkZjLP1cWxj5EtMmdgbq \
    --type slack_channel \
    --slack-channel-id slch_011CZkZmRt4vNq8sHbYw2KdX
  ```

  ```python Python
  client = anthropic.Anthropic()

  target = client.beta.organization.claude_tag.bundles.targets.create(
      "capp_011CZkZjLP1cWxj5EtMmdgbq",
      type="slack_channel",
      slack_channel_id="slch_011CZkZmRt4vNq8sHbYw2KdX",
  )

  print(target.id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const target = await client.beta.organization.claudeTag.bundles.targets.create(
    "capp_011CZkZjLP1cWxj5EtMmdgbq",
    { type: "slack_channel", slack_channel_id: "slch_011CZkZmRt4vNq8sHbYw2KdX" }
  );

  console.log(target.id);
  ```

  ```csharp C#
  using Anthropic.Models.Beta.Organization.ClaudeTag.Bundles.Targets;

  AnthropicClient client = new();

  var target = await client.Beta.Organization.ClaudeTag.Bundles.Targets.Create(
      "capp_011CZkZjLP1cWxj5EtMmdgbq",
      new()
      {
          BetaClaudeTagBundleTargetCreate = new BetaClaudeTagSlackChannelBundleTargetCreate
          {
              SlackChannelID = "slch_011CZkZmRt4vNq8sHbYw2KdX",
          },
      }
  );

  Console.WriteLine(target.ID);
  ```

  ```go Go
  client := anthropic.NewClient()

  target, err := client.Beta.Organization.ClaudeTag.Bundles.Targets.New(
  	context.Background(),
  	"capp_011CZkZjLP1cWxj5EtMmdgbq",
  	anthropic.BetaOrganizationClaudeTagBundleTargetNewParams{
  		BetaClaudeTagBundleTargetCreate: anthropic.BetaClaudeTagBundleTargetCreateUnionParam{
  			OfSlackChannel: &anthropic.BetaClaudeTagSlackChannelBundleTargetCreateParam{
  				SlackChannelID: "slch_011CZkZmRt4vNq8sHbYw2KdX",
  			},
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(target.ID)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.bundles.targets.TargetCreateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = TargetCreateParams.builder()
          .slackChannelBetaClaudeTagBundleTargetCreate("slch_011CZkZmRt4vNq8sHbYw2KdX")
          .build();
      var target = client.beta().organization().claudeTag().bundles().targets()
          .create("capp_011CZkZjLP1cWxj5EtMmdgbq", params);

      IO.println(target.id());
  }
  ```

  ```php PHP
  $client = new Client();

  $target = $client->beta->organization->claudeTag->bundles->targets->create(
      bundleID: 'capp_011CZkZjLP1cWxj5EtMmdgbq',
      betaClaudeTagBundleTargetCreate: [
          'type' => 'slack_channel',
          'slackChannelID' => 'slch_011CZkZmRt4vNq8sHbYw2KdX',
      ],
  );

  echo "{$target->id}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  bundle_id = "capp_011CZkZjLP1cWxj5EtMmdgbq"
  target = client.beta.organization.claude_tag.bundles.targets.create(
    bundle_id,
    beta_claude_tag_bundle_target_create: {
      type: :slack_channel,
      slack_channel_id: "slch_011CZkZmRt4vNq8sHbYw2KdX"
    }
  )

  puts target.id
  ```
</CodeGroup>

```json Response
{
  "type": "slack_channel",
  "id": "btgt_011CZkZpBv9yQd6wKhAr8MnU",
  "slack_channel_id": "slch_011CZkZmRt4vNq8sHbYw2KdX",
  "created_at": "2026-10-19T16:21:44Z"
}
```

워크스페이스에 Bundle을 연결합니다:

<CodeGroup>
  ```bash cURL
  curl -X POST "https://api.anthropic.com/v1/organizations/claude_tag/bundles/capp_011CZkZjLP1cWxj5EtMmdgbq/targets" \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28" \
    -d '{"type": "slack_workspace", "slack_workspace_id": "slws_011CZkZnWa7xPc3uJfZe5LgT"}'
  ```

  ```bash CLI
  ant beta:organization:claude-tag:bundles:targets create \
    --bundle-id capp_011CZkZjLP1cWxj5EtMmdgbq \
    --type slack_workspace \
    --slack-workspace-id slws_011CZkZnWa7xPc3uJfZe5LgT
  ```

  ```python Python
  client = anthropic.Anthropic()

  target = client.beta.organization.claude_tag.bundles.targets.create(
      "capp_011CZkZjLP1cWxj5EtMmdgbq",
      type="slack_workspace",
      slack_workspace_id="slws_011CZkZnWa7xPc3uJfZe5LgT",
  )

  print(target.id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const target = await client.beta.organization.claudeTag.bundles.targets.create(
    "capp_011CZkZjLP1cWxj5EtMmdgbq",
    { type: "slack_workspace", slack_workspace_id: "slws_011CZkZnWa7xPc3uJfZe5LgT" }
  );

  console.log(target.id);
  ```

  ```csharp C#
  using Anthropic.Models.Beta.Organization.ClaudeTag.Bundles.Targets;

  AnthropicClient client = new();

  var target = await client.Beta.Organization.ClaudeTag.Bundles.Targets.Create(
      "capp_011CZkZjLP1cWxj5EtMmdgbq",
      new()
      {
          BetaClaudeTagBundleTargetCreate = new BetaClaudeTagSlackWorkspaceBundleTargetCreate
          {
              SlackWorkspaceID = "slws_011CZkZnWa7xPc3uJfZe5LgT",
          },
      }
  );

  Console.WriteLine(target.ID);
  ```

  ```go Go
  client := anthropic.NewClient()

  target, err := client.Beta.Organization.ClaudeTag.Bundles.Targets.New(
  	context.Background(),
  	"capp_011CZkZjLP1cWxj5EtMmdgbq",
  	anthropic.BetaOrganizationClaudeTagBundleTargetNewParams{
  		BetaClaudeTagBundleTargetCreate: anthropic.BetaClaudeTagBundleTargetCreateUnionParam{
  			OfSlackWorkspace: &anthropic.BetaClaudeTagSlackWorkspaceBundleTargetCreateParam{
  				SlackWorkspaceID: "slws_011CZkZnWa7xPc3uJfZe5LgT",
  			},
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(target.ID)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.bundles.targets.TargetCreateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = TargetCreateParams.builder()
          .slackWorkspaceBetaClaudeTagBundleTargetCreate("slws_011CZkZnWa7xPc3uJfZe5LgT")
          .build();
      var target = client.beta().organization().claudeTag().bundles().targets()
          .create("capp_011CZkZjLP1cWxj5EtMmdgbq", params);

      IO.println(target.id());
  }
  ```

  ```php PHP
  $client = new Client();

  $target = $client->beta->organization->claudeTag->bundles->targets->create(
      bundleID: 'capp_011CZkZjLP1cWxj5EtMmdgbq',
      betaClaudeTagBundleTargetCreate: [
          'type' => 'slack_workspace',
          'slackWorkspaceID' => 'slws_011CZkZnWa7xPc3uJfZe5LgT',
      ],
  );

  echo "{$target->id}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  bundle_id = "capp_011CZkZjLP1cWxj5EtMmdgbq"
  target = client.beta.organization.claude_tag.bundles.targets.create(
    bundle_id,
    beta_claude_tag_bundle_target_create: {
      type: :slack_workspace,
      slack_workspace_id: "slws_011CZkZnWa7xPc3uJfZe5LgT"
    }
  )

  puts target.id
  ```
</CodeGroup>

채널에 대한 연결에는 적용 조건이 있습니다. 예를 들어 채널에 Slack 게스트가 없는 동안에만 적용되는 조건입니다. 조건은 claude.ai에서 설정되며 여기서는 반환되지 않습니다. 이 API를 통한 연결은 기본 조건을 사용하며, 이미 연결된 쌍을 연결하면 해당 조건은 변경되지 않습니다.

### Bundle 대상 가져오기

`GET /v1/organizations/claude_tag/bundles/{bundle_id}/targets/{target_id}`는 Bundle 대상을 반환합니다. `btgt_` 접두사가 없는 `target_id`는 `400`을 반환합니다. 다른 Bundle에 속하거나, 분리되었거나, 더 이상 설정되지 않은 채널이나 워크스페이스를 가리키는 경우 `404`를 반환합니다. `read:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl "https://api.anthropic.com/v1/organizations/claude_tag/bundles/capp_011CZkZjLP1cWxj5EtMmdgbq/targets/btgt_011CZkZpBv9yQd6wKhAr8MnU" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:bundles:targets retrieve \
    --bundle-id capp_011CZkZjLP1cWxj5EtMmdgbq \
    --target-id btgt_011CZkZpBv9yQd6wKhAr8MnU
  ```

  ```python Python
  client = anthropic.Anthropic()

  target = client.beta.organization.claude_tag.bundles.targets.retrieve(
      "btgt_011CZkZpBv9yQd6wKhAr8MnU",
      bundle_id="capp_011CZkZjLP1cWxj5EtMmdgbq",
  )

  print(target.type)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const target = await client.beta.organization.claudeTag.bundles.targets.retrieve(
    "btgt_011CZkZpBv9yQd6wKhAr8MnU",
    { bundle_id: "capp_011CZkZjLP1cWxj5EtMmdgbq" }
  );

  console.log(target.type);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var target = await client.Beta.Organization.ClaudeTag.Bundles.Targets.Retrieve(
      "btgt_011CZkZpBv9yQd6wKhAr8MnU",
      new() { BundleID = "capp_011CZkZjLP1cWxj5EtMmdgbq" }
  );

  Console.WriteLine(target.Type.GetString());
  ```

  ```go Go
  client := anthropic.NewClient()

  target, err := client.Beta.Organization.ClaudeTag.Bundles.Targets.Get(
  	context.Background(),
  	"btgt_011CZkZpBv9yQd6wKhAr8MnU",
  	anthropic.BetaOrganizationClaudeTagBundleTargetGetParams{
  		BundleID: "capp_011CZkZjLP1cWxj5EtMmdgbq",
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(target.Type)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.bundles.targets.TargetRetrieveParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = TargetRetrieveParams.builder()
          .bundleId("capp_011CZkZjLP1cWxj5EtMmdgbq")
          .build();
      var target = client.beta().organization().claudeTag().bundles().targets()
          .retrieve("btgt_011CZkZpBv9yQd6wKhAr8MnU", params);

      IO.println(target.type().asString());
  }
  ```

  ```php PHP
  $client = new Client();

  $target = $client->beta->organization->claudeTag->bundles->targets->retrieve(
      targetID: 'btgt_011CZkZpBv9yQd6wKhAr8MnU',
      bundleID: 'capp_011CZkZjLP1cWxj5EtMmdgbq',
  );

  echo "{$target->type}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  bundle_id = "capp_011CZkZjLP1cWxj5EtMmdgbq"
  target_id = "btgt_011CZkZpBv9yQd6wKhAr8MnU"
  target = client.beta.organization.claude_tag.bundles.targets.retrieve(
    target_id,
    bundle_id: bundle_id
  )

  puts target.type
  ```
</CodeGroup>

### Bundle 분리

`DELETE /v1/organizations/claude_tag/bundles/{bundle_id}/targets/{target_id}`는 Bundle을 분리합니다. 분리를 반복하면 `404`가 반환됩니다. `write:claude_tag` 범위가 필요합니다.

<CodeGroup>
  ```bash cURL
  curl -X DELETE "https://api.anthropic.com/v1/organizations/claude_tag/bundles/capp_011CZkZjLP1cWxj5EtMmdgbq/targets/btgt_011CZkZpBv9yQd6wKhAr8MnU" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: claude-tag-2026-09-28"
  ```

  ```bash CLI
  ant beta:organization:claude-tag:bundles:targets delete \
    --bundle-id capp_011CZkZjLP1cWxj5EtMmdgbq \
    --target-id btgt_011CZkZpBv9yQd6wKhAr8MnU
  ```

  ```python Python
  client = anthropic.Anthropic()

  deleted_target = client.beta.organization.claude_tag.bundles.targets.delete(
      "btgt_011CZkZpBv9yQd6wKhAr8MnU",
      bundle_id="capp_011CZkZjLP1cWxj5EtMmdgbq",
  )

  print(deleted_target.id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const deletedTarget = await client.beta.organization.claudeTag.bundles.targets.delete(
    "btgt_011CZkZpBv9yQd6wKhAr8MnU",
    { bundle_id: "capp_011CZkZjLP1cWxj5EtMmdgbq" }
  );

  console.log(deletedTarget.id);
  ```

  ```csharp C#
  AnthropicClient client = new();

  var deletedTarget = await client.Beta.Organization.ClaudeTag.Bundles.Targets.Delete(
      "btgt_011CZkZpBv9yQd6wKhAr8MnU",
      new() { BundleID = "capp_011CZkZjLP1cWxj5EtMmdgbq" }
  );

  Console.WriteLine(deletedTarget.ID);
  ```

  ```go Go
  client := anthropic.NewClient()

  deletedTarget, err := client.Beta.Organization.ClaudeTag.Bundles.Targets.Delete(
  	context.Background(),
  	"btgt_011CZkZpBv9yQd6wKhAr8MnU",
  	anthropic.BetaOrganizationClaudeTagBundleTargetDeleteParams{
  		BundleID: "capp_011CZkZjLP1cWxj5EtMmdgbq",
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(deletedTarget.ID)
  ```

  ```java Java
  import com.anthropic.models.beta.organization.claudetag.bundles.targets.TargetDeleteParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = TargetDeleteParams.builder()
          .bundleId("capp_011CZkZjLP1cWxj5EtMmdgbq")
          .build();
      var deletedTarget = client.beta().organization().claudeTag().bundles().targets()
          .delete("btgt_011CZkZpBv9yQd6wKhAr8MnU", params);

      IO.println(deletedTarget.id());
  }
  ```

  ```php PHP
  $client = new Client();

  $deletedTarget = $client->beta->organization->claudeTag->bundles->targets->delete(
      targetID: 'btgt_011CZkZpBv9yQd6wKhAr8MnU',
      bundleID: 'capp_011CZkZjLP1cWxj5EtMmdgbq',
  );

  echo "{$deletedTarget->id}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  bundle_id = "capp_011CZkZjLP1cWxj5EtMmdgbq"
  target_id = "btgt_011CZkZpBv9yQd6wKhAr8MnU"
  deleted_target = client.beta.organization.claude_tag.bundles.targets.delete(
    target_id,
    bundle_id: bundle_id
  )

  puts deleted_target.id
  ```
</CodeGroup>

```json Response
{
  "type": "bundle_target_deleted",
  "id": "btgt_011CZkZpBv9yQd6wKhAr8MnU"
}
```

## 인식할 수 없는 값

`guest_policy.type`, 출처의 `type`, Bundle 대상의 `type`, 그리고 오류 코드에는 언제든지 새로운 값이 추가될 수 있습니다. 인식할 수 없는 값은 실패로 처리하지 말고, 다른 알 수 없는 문자열과 마찬가지로 처리하세요.

## 속도 제한

요청은 조직 단위로 제한되며, 조직의 모든 키가 공유하고 조직의 다른 Admin API 제한과는 별개인 두 가지 예산이 있습니다. 각 예산은 버스트를 허용한 후 일정한 속도로 보충됩니다:

| 예산 | 요청                   | 버스트 | 보충    |
| -- | -------------------- | --- | ----- |
| 읽기 | 모든 `GET`             | 120 | 초당 2회 |
| 변경 | 모든 `POST` 및 `DELETE` | 60  | 초당 1회 |

예산을 초과한 요청은 `retry-after` 헤더와 함께 **429 Too Many Requests**를 반환합니다. 응답에는 요청이 소비한 예산에 대한 `anthropic-ratelimit-requests-limit`, `anthropic-ratelimit-requests-remaining`, `anthropic-ratelimit-requests-reset` 헤더가 포함됩니다.

## 페이지네이션

목록 엔드포인트는 **불투명 커서**를 사용합니다. 첫 번째 요청은 최대 `limit`개의 행과 `next_page` 커서를 반환합니다. 다음 요청에서 커서를 변경하지 않고 `page` 매개변수로 전달하고, `next_page`가 `null`이 될 때까지 반복하세요. 커서 문자열은 불투명한 값으로 취급하세요. 직접 파싱하거나, 수정하거나, 생성하지 마세요. [채널 목록 조회](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#list-channels)는 `next_page`가 여전히 설정된 상태에서 `limit`보다 적은 채널이 있거나 채널이 없는 페이지를 반환할 수 있으므로, `next_page`가 `null`이 될 때까지 계속 페이지를 요청하세요. Python, TypeScript, C#, Go, Java, Ruby SDK의 목록 반복자와 CLI(`--format raw` 사용 시 제외)는 이를 자동으로 처리합니다. PHP와 curl에서는 각 페이지를 직접 요청하고 해당 `next_page`를 `page`로 전달하세요.

`limit`의 기본값은 20이며, 최솟값은 1, 최댓값은 100입니다. 모든 목록은 `created_at` 기준 최신순으로 정렬되며, 다른 정렬 순서는 지원하지 않습니다.

## 오류 응답

오류 응답은 [오류](https://platform.claude.com/docs/ko/api/errors)에 설명된 표준 형식을 따릅니다. 지원팀에 문의할 때는 응답 본문의 `request_id`를 함께 알려 주세요.

| 상태  | 의미                                                                                                                |
| --- | ----------------------------------------------------------------------------------------------------------------- |
| 400 | 잘못된 입력이거나, 해당 작업이 이 채널, 워크스페이스 또는 Bundle에 적용되지 않습니다(각 엔드포인트 섹션 참조).                                               |
| 401 | `x-api-key` 헤더가 없거나 키를 인식할 수 없습니다.                                                                                |
| 403 | 키가 조직 수준의 범위가 지정된 키가 아니거나, 필요한 범위가 없거나, 조직이 이 변경을 수행할 수 없습니다.                                                     |
| 404 | 리소스를 찾을 수 없거나 조직의 리소스가 아닙니다. 요청에 `anthropic-beta` 값이 누락되었거나 조직에 API가 활성화되지 않은 경우에도 반환되어, 엔드포인트가 존재하지 않는 것처럼 보입니다. |
| 409 | 요청이 실행되는 동안 다른 무언가가 리소스를 변경하거나 제거했습니다. 아무것도 저장되지 않았습니다. 리소스를 다시 읽고 여전히 필요하다면 변경 사항을 다시 보내세요.                      |
| 429 | 속도 제한을 초과했습니다. [속도 제한](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#rate-limiting)을 참조하세요.    |
| 500 | 내부 오류입니다.                                                                                                         |
| 503 | 일시적인 오류입니다. 변경 요청의 경우 변경 사항이 저장되었는지 여부를 알려 주지 않습니다. 모든 변경은 반복해도 안전하므로 요청을 변경 없이 다시 보내세요.                          |

하나의 상태 코드에 서로 다르게 처리해야 하는 여러 원인이 있는 경우, 오류에는 `error.details.error_code`도 포함됩니다:

```json
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "...",
    "details": {
      "error_code": "slack_channel_set_up_settings_refused",
      "slack_channel_id": "slch_011CZkZmRt4vNq8sHbYw2KdX"
    }
  },
  "request_id": "req_018EeWyXxfu5pfWkrYcMdjWG"
}
```

| `error_code`                                 | 상태  | 의미 및 조치 방법                                                                                                                                                                  |
| -------------------------------------------- | --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `organization_level_scoped_api_key_required` | 403 | 자격 증명이 조직 전체에 속한 범위가 지정된 Admin API 키가 아닙니다. 기본 소유자에게 키를 요청하세요.                                                                                                              |
| `api_key_scope_missing`                      | 403 | 키에 엔드포인트가 요구하는 `read:claude_tag` 또는 `write:claude_tag`가 없습니다.                                                                                                               |
| `workspace_selection_not_accepted`           | 400 | 요청에 `anthropic-workspace-id` 헤더가 포함되었습니다. 제거하세요.                                                                                                                            |
| `claude_tag_writes_not_enabled`              | 403 | 조직이 이 API를 통해 읽을 수는 있지만 변경은 활성화되지 않았습니다.                                                                                                                                    |
| `compliance_configuration_restricted`        | 403 | 조직에 제로 데이터 보존과 같이 Claude Tag가 새로운 내용을 저장하지 않는 규정 준수 구성이 있습니다. 채널 설정, 설정 업데이트(지우는 경우 포함), Bundle 연결은 거부됩니다. Bundle 분리와 채널 제거는 거부되지 않습니다.                                     |
| `environment_not_found`                      | 404 | `environment_id`가 조직이 여기서 사용할 수 있는 환경을 가리키지 않습니다. 경로의 `id`는 문제가 없습니다.                                                                                                       |
| `environment_archived`                       | 400 | `environment_id`가 보관된 환경을 가리킵니다.                                                                                                                                            |
| `slack_channel_set_up_settings_refused`      | 400 | 요청이 채널을 설정한 후 `settings`가 거부되었습니다. `details.slack_channel_id`가 해당 채널입니다. [채널 설정](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#set-up-a-channel)을 참조하세요. |
| `slack_channel_set_up_environment_not_found` | 404 | 요청이 채널을 설정한 후 `environment_id`를 찾을 수 없었습니다. `details.slack_channel_id`가 해당 채널입니다.                                                                                           |
| `slack_channel_set_up_settings_conflict`     | 409 | 요청이 채널을 설정한 후 다른 변경이 `settings`와 겹쳤습니다. `settings`의 어떤 내용도 저장되지 않았습니다. `details.slack_channel_id`가 해당 채널입니다.                                                                |
| `slack_channel_not_configured`               | 400 | 채널이 [구성](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#configured-levels)되지 않았으므로 제거할 수 없습니다.                                                            |

새로운 코드가 추가될 수 있습니다. 인식하지 못하는 코드는 해당 상태 코드와 동일하게 처리하세요. `error_code`가 없는 `404`에는 두 가지 원인 중 하나가 있습니다. 요청이 지정한 무언가(경로의 `id`, 또는 본문이나 쿼리의 Slack 채널이나 워크스페이스)를 찾을 수 없었거나, 요청에 `anthropic-beta` 값이 누락되었거나 조직에 API가 활성화되지 않아 모든 엔드포인트가 존재하지 않는 것처럼 보이는 경우입니다. 둘을 구분하려면 동일한 키와 헤더로 [Slack 기본값을 가져오세요](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#get-the-slack-defaults). 이 요청은 아무것도 지정하지 않으므로 두 번째 경우에만 `404`를 반환합니다.

## Activity Feed 이벤트

이 API를 통한 모든 변경 사항은 조직의 [Compliance API Activity Feed](https://platform.claude.com/docs/ko/manage-claude/compliance-activity-feed)에 기록되며, `apikey_` ID를 가진 `api_actor`로서 API 키에 귀속됩니다. 이 이벤트들은 claude.ai에서 동일한 변경을 수행했을 때 피드가 기록하는 이벤트와 같으므로, 변경이 어떤 방식으로 이루어졌든 하나의 쿼리로 찾을 수 있습니다.

| 이벤트                               | 발생 시점                                                                                                                                         |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `ccr_agent_created`               | 채널이 설정될 때.                                                                                                                                    |
| `ccr_agent_updated`               | 채널, 워크스페이스 또는 Slack 기본값의 설정이 변경되거나, 특정 수준이 [구성된](https://platform.claude.com/docs/ko/manage-claude/claude-tag-api#configured-levels) 상태가 될 때. |
| `ccr_agent_deleted`               | 채널이 제거될 때. 해당 채널의 Bundle 대상도 함께 제거되며 자체 이벤트는 발생하지 않습니다.                                                                                       |
| `ccr_agent_proxy_profile_bound`   | Bundle이 연결될 때.                                                                                                                                |
| `ccr_agent_proxy_profile_unbound` | Bundle이 분리될 때.                                                                                                                                |

이벤트는 채널 또는 워크스페이스를 `id`가 아닌 `agent_id`로 지칭합니다. 두 Bundle 이벤트는 `profile_id`에 Bundle을, `scope_id`에 채널 또는 워크스페이스를 지정합니다.

`ccr_agent_updated` 이벤트는 변경된 항목을 피드 고유의 이름으로 `updated_fields`에 나열합니다:

| 설정                 | `updated_fields`에서의 이름   |
| ------------------ | ------------------------ |
| `enabled`          | `slackbot_version`       |
| `instructions`     | `system_prompt_addendum` |
| `model`            | `default_model`          |
| `environment_id`   | `default_environment_id` |
| `guest_policy`     | `guest_policy`           |
| (해당 수준이 구성된 상태가 됨) | `is_virtual`             |

읽기, 아무것도 변경하지 않는 요청, 그리고 저장되기 전에 거부된 요청은 아무것도 기록하지 않습니다. 채널을 설정한 후 `settings`가 거부된 설정 요청은 `ccr_agent_created`를 기록합니다.

## 참고 항목

<CardGroup cols={2}>
  <Card title="Admin API 키 생성" href="https://platform.claude.com/docs/ko/manage-claude/admin-api-keys">
    기본 소유자가 범위가 지정된 키를 생성하는 곳입니다.
  </Card>

  <Card title="Claude Tag 문서" href="https://claude.com/docs/claude-tag/overview">
    Claude Tag가 무엇인지, 설정 방법, 그리고 Slack에서 각 설정이 하는 일을 설명합니다.
  </Card>

  <Card title="Compliance API Activity Feed" href="https://platform.claude.com/docs/ko/manage-claude/compliance-activity-feed">
    여기와 claude.ai에서 이루어진 모든 변경 사항의 감사 추적입니다.
  </Card>

  <Card title="Plugins API" href="https://platform.claude.com/docs/ko/manage-claude/plugins-api">
    Claude Enterprise 조직의 플러그인을 관리합니다.
  </Card>
</CardGroup>
