> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/reference/ko/authentication/authentication/manage-api-keys.md).

# API 키 관리

## 정보

Roboflow API를 사용하여 워크스페이스의 API 키를 프로그래밍 방식으로 관리할 수 있습니다. 새 키를 생성하고, 기존 키를 나열 및 검토하고, 이름을 바꾸고, 메타데이터를 첨부하고, 비활성화하고, 보호하고, 폐기할 수 있습니다.

이는 다음에서 사용하는 것과 동일한 인터페이스입니다 [`roboflow api-key` CLI](#cli) 및 [Roboflow MCP 서버](https://docs.roboflow.com/agents/mcp-server), 그래서 자동화 에이전트가 사람이 대시보드에서 복사해 붙여넣지 않아도 애플리케이션이 필요한 키를 프로비저닝할 수 있습니다.

{% hint style="info" %}
**비밀값은 한 번만 쓸 수 있습니다.** 전체 키 값은 반환됩니다 **오직** 키를 생성(또는 교체)할 때만. 다른 모든 엔드포인트는 비밀이 아닌 `keyId` 핸들과 짧은 `접두사` 를 식별용으로 사용합니다 - 키 자체는 절대 아닙니다. 값을 안전하게 저장하세요(예: a `.gitignore`에 포함된 `.env`)를 생성 시점에.
{% endhint %}

## HTTP API

### 인증

API 키를 다음으로 보내세요 `api_key` 쿼리 매개변수 또는 `Authorization: Bearer <api_key>` 헤더로 보내세요. 다른 모든 REST 엔드포인트와 동일합니다(참조 [REST API로 인증](/reference/ko/platform/rest-api/authenticate-with-the-rest-api.md)). 사용 중인 키는 경로의 워크스페이스에 속해야 합니다.

이 엔드포인트들은 Roboflow의 [역할 및 권한](/reference/ko/authentication/authentication/scoped-api-keys.md). 호출자가 **사용자를 대신하는 OAuth 토큰일 때**, 관련 RBAC 작업(`create_api_key`, `update_api_key`, `revoke_api_key`, `get_api_key`, `view_workspace_api_keys`)는 기본적으로 워크스페이스 **소유자/관리자**. 스코프가 지정된 키(또는 사용자를 대신하는 OAuth 토큰)로 보낸 요청은 호출자 자신이 이미 가진 능력만 생성하거나 부여할 수 있습니다 - 참조 [권한 부분집합 규칙](#privilege-subset-rules).

호출자가 **스코프가 지정된(비-OAuth) 개인 키**, 또한 [스코프](/reference/ko/authentication/authentication/sign-in-with-roboflow-getting-started.md#available-scopes) 엔드포인트와 일치하는:

| 엔드포인트               | 필수 스코프           |
| ------------------- | ---------------- |
| `GET` 목록 / `GET` 하나 | `api-key:read`   |
| `POST` 생성           | `api-key:create` |
| `PATCH` 업데이트        | `api-key:update` |
| `DELETE` 폐기         | `api-key:revoke` |
| `GET` 공개 가능         | `workspace:read` |

스코프가 없는(전체 액세스) 개인 키는 이미 이 모든 조건을 충족합니다. 필수 스코프가 없는 키는 경로가 존재하지 않는 것처럼 처리됩니다 - 참조 [오류](#errors).

{% hint style="warning" %}
하나의 [공개 가능한 키](#the-publishable-key) (`rf_<workspaceId>`)는 **아니며** 이 관리 엔드포인트의 인증 수단으로 허용되지 않습니다. 개인 키로 인증하세요.
{% endhint %}

### API 키 목록

<mark style="color:초록;">`GET`</mark> `/:workspace/api-keys`

워크스페이스의 API 키(마스킹됨)를 나열하고 워크스페이스 공개 가능한 키를 반환합니다.

**쿼리**

<table data-search="false"><thead><tr><th width="180">이름</th><th width="140">유형</th><th>설명</th><th data-type="checkbox">필수</th></tr></thead><tbody><tr><td><code>api_key</code></td><td>문자열</td><td>워크스페이스용 개인 API 키입니다.</td><td>true</td></tr><tr><td><code>includeDisabled</code></td><td>boolean</td><td>결과에 비활성화된 키를 포함합니다(기본값 <code>false</code>).</td><td>false</td></tr><tr><td><code>includeFolders</code></td><td>boolean</td><td>폴더 범위 키에 대한 폴더 세부 정보를 채워 넣습니다(기본값 <code>false</code>).</td><td>false</td></tr></tbody></table>

**예시 요청**

```bash
curl --location 'https://api.roboflow.com/<workspace_id>/api-keys?api_key=$ROBOFLOW_API_KEY'
```

**응답**

{% tabs %}
{% tab title="200" %}

```json
{
  "apiKeys": [
    {
      "keyId": "9f8c1a2b3d4e5f60",
      "name": "production-server",
      "prefix": "abcd",
      "scopes": ["model:infer"],
      "folderIds": [],
      "default": false,
      "protected": true,
      "disabled": false,
      "created_on": "2026-06-19T18:24:01.000Z",
      "created_by": "user_abc123",
      "custom_metadata": { "env": "prod" }
    }
  ],
  "publishableKey": "rf_<workspace_id>"
}
```

{% endtab %}
{% endtabs %}

참고:

* `keyId` 다른 엔드포인트에서 키를 참조하는 데 사용하는 안정적인 비밀이 아닌 핸들입니다.
* `scopes` 는 `null` 스코프가 없는(전체 액세스) 키의 경우 null이거나, [스코프 문자열](/reference/ko/authentication/authentication/sign-in-with-roboflow-getting-started.md#available-scopes) 스코프가 지정된 키의 경우입니다.
* `created_on` (ISO 8601) 및 `created_by` 는 해당 값이 기록된 키에만 포함됩니다. 이 기록이 추적되기 전에 생성된 이전 키에는 포함되지 않습니다.
* `created_by` 는 **불투명한** 키를 생성한 사람을 식별하는 식별자입니다 - 사용자 ID, `api_key:<handle>` (키가 다른 API 키에 의해 생성된 경우) 또는 `SYSTEM` (자동화된 프로세스에 의해 생성됨). 표시/감사용 문자열로 취급하고, 파싱하지 마세요.
* `custom_metadata` 가 포함됩니다 **오직** 워크스페이스 요금제에 Advanced API Keys가 포함된 경우. 이 기능이 없으면 해당 필드는 완전히 존재하지 않습니다(메타데이터가 있는 키에서도).

### 단일 API 키 가져오기

<mark style="color:초록;">`GET`</mark> `/:workspace/api-keys/:keyId`

핸들로 지정된 하나의 키에 대한 마스킹된 메타데이터를 반환합니다. `keyId` 핸들.

**예시 요청**

```bash
curl --location 'https://api.roboflow.com/<workspace_id>/api-keys/<key_id>?api_key=$ROBOFLOW_API_KEY'
```

**응답**

{% tabs %}
{% tab title="200" %}

```json
{ "apiKey": { "keyId": "9f8c1a2b3d4e5f60", "name": "production-server", "prefix": "abcd", "scopes": ["model:infer"], "folderIds": [], "default": false, "protected": true, "disabled": false, "created_on": "2026-06-19T18:24:01.000Z", "created_by": "user_abc123" } }
```

{% endtab %}

{% tab title="404" %}
그런 키는 `keyId` 워크스페이스에 존재하지 않거나(또는 폐기되었습니다), **또는** 자격 증명에 다음이 없습니다: `api-key:read` 스코프 / 자신이 속하지 않은 워크스페이스를 대상으로 합니다. 권한의 경우 객체 형태의 오류 `{"error": {"message", "type", "hint"}}`; 알 수 없는 `keyId` 은 반환합니다 `{"error": "string"}`. 참조 [오류](#errors).
{% endtab %}
{% endtabs %}

### API 키 생성

<mark style="color:초록;">`POST`</mark> `/:workspace/api-keys`

새 API 키를 생성합니다. 비밀 값은 **한 번** key `field` 에.

**헤더**

| 이름           | 값                  |
| ------------ | ------------------ |
| Content-Type | `application/json` |

**본문**

<table data-search="false"><thead><tr><th width="180">이름</th><th width="200">유형</th><th>설명</th><th data-type="checkbox">필수</th></tr></thead><tbody><tr><td><code>name</code></td><td>문자열</td><td>키에 대한 사람이 읽기 쉬운 라벨입니다.</td><td>false</td></tr><tr><td><code>scopes</code></td><td>Array&#x3C;string> | null</td><td>키를 다음으로 제한합니다 <a href="/pages/a4b5cc98d3bc113b0ff0f538773b484f9e8b2789#available-scopes">scopes</a>. 아래의 세 가지 상태를 참조하세요. <strong>Advanced API Keys가 필요합니다.</strong></td><td>false</td></tr><tr><td><code>folderIds</code></td><td>Array&#x3C;string></td><td>키를 다음 프로젝트 폴더로 제한합니다. <strong>Advanced API Keys가 필요합니다.</strong></td><td>false</td></tr><tr><td><code>custom_metadata</code></td><td>Map&#x3C;string, string></td><td>최대 20개의 키/값 쌍(키 ≤100자, 값 ≤500자). <strong>Advanced API Keys가 필요합니다.</strong></td><td>false</td></tr><tr><td><code>protected</code></td><td>boolean</td><td>키를 다음 상태로 생성합니다: <a href="#protecting-a-key">protected</a> 상태.</td><td>false</td></tr></tbody></table>

{% hint style="info" %}
**`scopes` 생성 시:**

* **생략** - 새 키는 **호출 자격 증명 자체의 스코프를 상속합니다** ("나와 같은 키를 생성"). 이는 요금제와 무관합니다: 전체 액세스 키는 전체 액세스 키를 생성하고; 스코프가 지정된 키는 동일한 스코프의 키를 생성하며; 폴더도 같은 방식으로 상속됩니다. 생략하는 스크립트는 `scopes` 워크스페이스에 Advanced API Keys 기능이 있든 없든 동일하게 동작합니다.
* **`null`** - 명시적인 **전체 액세스** (스코프 없음) 키입니다. 호출자 자신이 전체 액세스를 보유하고 있어야 합니다(스코프가 지정된 호출자는 거부됩니다 - 참조 [부분집합 규칙](#privilege-subset-rules)).
* **`[]`** (빈 배열) - 유효한 키이지만 **능력이 없음**; 모든 스코프 지정 경로에서 거부됩니다. 나중에 스코프를 부여할 플레이스홀더로 유용합니다.
* **`["model:infer", …]`** - **스코프가 지정된** 정확히 해당 능력에 대해 ( [섹션 이름](/reference/ko/authentication/authentication/sign-in-with-roboflow-getting-started.md#available-scopes) 예를 들어 `모델` 는 해당 섹션의 모든 스코프를 부여합니다).
* **`["role:reviewer", …]`** - 하나의 [**역할 프리셋**](/reference/ko/authentication/authentication/scoped-api-keys.md): 생성 시 해당 역할의 스코프로 확장됩니다. 내장 역할(`라벨러`, `검토자`, `소유자`) 또는 사용자 지정 역할의 이름을 사용하세요; `role:owner` 는 전체 액세스를 의미합니다. 명시적 스코프와 함께 조합할 수 있습니다.

명시적인 `scopes` **배열** (`[]`, 목록 또는 `역할:` 프리셋), `folderIds`, 또는 `custom_metadata` 다음이 필요합니다: **Advanced API Keys** 요금제 기능(그렇지 않으면 `403`). 생략하면 `scopes` (상속) 및 `null` (전체)은 그렇지 않습니다 - 따라서 기본값은 모든 요금제에서 작동합니다.
{% endhint %}

**예시 요청**

```bash
curl --location 'https://api.roboflow.com/<workspace_id>/api-keys?api_key=$ROBOFLOW_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
    "name": "production-server",
    "scopes": ["model:infer"]
}'
```

**응답**

{% tabs %}
{% tab title="201" %}

```json
{
  "keyId": "9f8c1a2b3d4e5f60",
  "key": "AbCdEf0123456789xyz",
  "name": "production-server",
  "scopes": ["model:infer"],
  "folderIds": [],
  "protected": false,
  "publishableKey": "rf_<workspace_id>"
}
```

{% endtab %}

{% tab title="403" %}
호출자는 키를 생성할 수 있지만, 보유한 범위를 넘어 스코프/폴더 부여를 요청했거나 워크스페이스 요금제에 요청한 고급 기능이 포함되어 있지 않습니다. 본문: `{"error": "string"}`.
{% endtab %}

{% tab title="404" %}
자격 증명에 다음이 없습니다: `api-key:create` 스코프가 없거나, 자신이 속하지 않은 워크스페이스를 대상으로 합니다. 본문: `{"error": {"message", "type", "hint"}}`. 참조 [오류](#errors).
{% endtab %}
{% endtabs %}

{% hint style="danger" %}
해당 `field` 필드가 비밀 값이며 표시됩니다 **오직** 이 응답에서. 지금 저장하세요. 다시는 가져올 수 없습니다.
{% endhint %}

### API 키 업데이트

<mark style="color:파랑;">`PATCH`</mark> `/:workspace/api-keys/:keyId`

키의 이름, 스코프 또는 메타데이터를 업데이트합니다. 보호를 설정하거나; 활성화/비활성화합니다.

**헤더**

| 이름           | 값                  |
| ------------ | ------------------ |
| Content-Type | `application/json` |

**본문** (변경하려는 필드만 보내세요)

<table data-search="false"><thead><tr><th width="180">이름</th><th width="200">유형</th><th>설명</th><th data-type="checkbox">필수</th></tr></thead><tbody><tr><td><code>name</code></td><td>문자열</td><td>새 표시 이름.</td><td>false</td></tr><tr><td><code>scopes</code></td><td>Array&#x3C;string> | null</td><td>새 <a href="/pages/a4b5cc98d3bc113b0ff0f538773b484f9e8b2789#available-scopes">scopes</a> (호출자의 부분집합). 아래의 세 가지 상태를 참조하세요. <strong>Advanced API Keys가 필요합니다.</strong></td><td>false</td></tr><tr><td><code>custom_metadata</code></td><td>Map&#x3C;string, string></td><td>키의 메타데이터를 대체합니다. <strong>Advanced API Keys가 필요합니다.</strong></td><td>false</td></tr><tr><td><code>protected</code></td><td><code>true</code></td><td>키를 보호합니다. API는 <strong>보호를 해제할 수 없습니다</strong> - 아래를 참조하세요.</td><td>false</td></tr><tr><td><code>비활성화됨</code></td><td>boolean</td><td>비활성화(<code>true</code>) 또는 다시 활성화(<code>false</code>) 키. <strong>Advanced API Keys가 필요합니다.</strong></td><td>false</td></tr></tbody></table>

{% hint style="info" %}
**다음의 세 가지 상태: `scopes`** (PATCH 의미는 생성과 약간 다릅니다 - 필드를 생략하면 변경되지 않습니다):

* **생략** - 키의 기존 스코프가 **변경되지 않은 채 유지됩니다**.
* **`null`** - 키는 다음이 됩니다: **전체 액세스** (스코프 없음). 이를 부여하려면 호출자 자신이 전체 액세스를 보유해야 합니다.
* **`[]`** (빈 배열) - 키는 유효한 자격 증명을 유지하지만 **능력이 없음**.
* **`["model:infer", …]`** - **대체합니다** 키의 스코프를 정확히 이 집합으로 ( [섹션 이름](/reference/ko/authentication/authentication/sign-in-with-roboflow-getting-started.md#available-scopes) 는 해당 섹션의 모든 스코프로 확장됩니다).

전송 `scopes` (**포함하여 `[]` 또는 `null`**), `custom_metadata`, 또는 `비활성화됨` 다음이 필요합니다: **Advanced API Keys** 요금제 기능.
{% endhint %}

**예시 요청**

```bash
curl --location --request PATCH 'https://api.roboflow.com/<workspace_id>/api-keys/<key_id>?api_key=$ROBOFLOW_API_KEY' \
--header 'Content-Type: application/json' \
--data '{ "name": "renamed-key" }'
```

**응답**

{% tabs %}
{% tab title="200" %}

```json
{ "apiKey": { "keyId": "9f8c1a2b3d4e5f60", "name": "renamed-key", "prefix": "abcd", "scopes": ["model:infer"], "folderIds": [], "default": false, "protected": false, "disabled": false } }
```

{% endtab %}

{% tab title="403" %}
다음 경우 반환됩니다: `"protected": false` (API는 키 보호를 해제할 수 없습니다) 또는 호출자가 부여할 수 없는 스코프를 요청한 경우. 본문: `{"error": "string"}`.
{% endtab %}

{% tab title="404" %}
그런 키는 `keyId` 워크스페이스에 있으며(본문: `{"error": "string"}`), **또는** 자격 증명에 다음이 없습니다: `api-key:update` 스코프 / 자신이 속하지 않은 워크스페이스를 대상으로 합니다(본문: `{"error": {"message", "type", "hint"}}`). 참조 [오류](#errors).
{% endtab %}

{% tab title="409" %}
현재 비활성화됨인 키를 비활성화하려고 하면 반환됩니다: [protected](#protecting-a-key).
{% endtab %}
{% endtabs %}

### API 키 폐기

<mark style="color:빨강;">`DELETE`</mark> `/:workspace/api-keys/:keyId`

키를 폐기(영구적으로 비활성화)합니다. 이를 사용하는 기존 애플리케이션은 즉시 인증에 실패합니다.

**예시 요청**

```bash
curl --location --request DELETE 'https://api.roboflow.com/<workspace_id>/api-keys/<key_id>?api_key=$ROBOFLOW_API_KEY'
```

**응답**

{% tabs %}
{% tab title="200" %}

```json
{ "status": "revoked", "keyId": "9f8c1a2b3d4e5f60" }
```

{% endtab %}

{% tab title="409" %}
키는 보호되어 있습니다 [protected](#protecting-a-key). 먼저 Roboflow 대시보드에서 보호를 해제하세요.
{% endtab %}
{% endtabs %}

### 키 보호하기

하나의 **protected** 키는 API, CLI, MCP 서버, *또는* 대시보드에서 보호가 해제되기 전까지 비활성화하거나 폐기할 수 없습니다. 자동화 에이전트가 실수로 운영 키를 내려버리는 것을 막는 데 사용하세요.

* **보호:** `PATCH` 로 `{ "protected": true }`.
* **보호 해제:** 할 수 있습니다 **오직** 다음에서 수행할 수 있습니다: [대시보드](https://app.roboflow.com/settings/api). API/CLI/MCP는 의도적으로 키의 보호를 해제할 수 없도록 되어 있어, 손상되었거나 지나치게 적극적인 에이전트가 안전장치를 제거한 뒤 한 번에 키를 폐기하는 일을 막습니다.

### 공개 가능한 키

모든 워크스페이스에는 **공개 가능한 키** 형식의 `rf_<workspaceId>`. 이는 다음과 같습니다:

* **비밀 아님** - 클라이언트 측 / 브라우저 코드에 포함해도 안전합니다(예: [inferencejs](https://docs.roboflow.com/deployment/self-hosted/sdks/web-browser)).
* **추론 + 모델 다운로드 전용** - 데이터를 관리하거나, 학습하거나, 키를 관리할 수 없습니다.
* **영구적** - 워크스페이스 ID에서 파생되므로 생성, 교체 또는 폐기할 수 없습니다.

다음에서 읽을 수 있습니다: `publishableKey` 목록/생성 응답의 필드에서 확인하거나, 직접:

<mark style="color:초록;">`GET`</mark> `/:workspace/api-keys/publishable`

```bash
curl --location 'https://api.roboflow.com/<workspace_id>/api-keys/publishable?api_key=$ROBOFLOW_API_KEY'
# { "publishableKey": "rf_<workspace_id>" }
```

브라우저/엣지 추론에는 공개 가능한 키를, 서버 측 작업에는 스코프가 지정된 개인 키를 사용하세요. 공개 가능한 키를 보유한 누구든 해당 워크스페이스 모델에 대해 추론을 실행하고 다운로드할 수 있다는 점에 유의하세요 - 이것이 "공개 가능" 자격 증명의 의도된 절충입니다.

### 권한 부분집합 규칙

권한 상승을 방지하기 위해, 새로 생성되거나 업데이트된 키는 이를 생성하는 자격 증명보다 더 많은 권한을 가질 수 없습니다:

* 이러한 엔드포인트를 **범위가 지정된 개인 키**로 호출하면, 새 키의 `scopes` 는 호출 키의 스코프의 부분집합이어야 하며, 그 `folderIds` 는 호출 키의 폴더의 부분집합이어야 합니다. 스코프가 지정되지 않은(전체 접근) 키는 무엇이든 부여할 수 있습니다.
* 스코프가 지정되지 않은 키로 **사용자를 대신하는 OAuth 토큰일 때** 호출하면, 요청된 스코프는 그 사용자의 역할과도 추가로 검사됩니다. 즉, 역할이 허용하는 권한만 부여할 수 있습니다.

호출자가 부여할 수 있는 범위를 초과하는 요청은 `403`.

### 오류

| 상태    | 의미                                                                                                                                      | 오류 형식                                                                                         |
| ----- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `400` | 잘못된 요청 본문(예: 알 수 없는 스코프, 잘못된 메타데이터).                                                                                                    | `{"error": "string"}`                                                                         |
| `403` | 호출자는 경로에 대해 승인되었지만 **자신이 보유한 것보다 더 많은 권한을 부여하려고 했습니다** (호출자의 권한을 초과하는 스코프/폴더), 요금제에 Advanced API Keys가 없거나, API를 통해 보호 해제를 시도한 경우입니다.   | `{"error": "string"}`                                                                         |
| `404` | 해당 `keyId` 를 가진 키가 워크스페이스에 없거나, **또는** 자격 증명에 경로에 필요한 스코프가 없거나, **또는** 키가 속하지 않은 워크스페이스를 대상으로 합니다. Roboflow는 리소스가 존재하는지 여부를 의도적으로 숨깁니다. | `{"error": {"message", "type", "hint"}}` 권한/워크스페이스의 경우; `{"error": "string"}` 알 수 없는 `keyId`. |
| `409` | 이 키는 보호되어 있으며 비활성화/폐기할 수 없습니다.                                                                                                          | `{"error": "string"}`                                                                         |

{% hint style="warning" %}
**두 가지 오류 본문 형식.** 대부분의 엔드포인트는 **문자열** 오류 - `{"error": "Some message"}`를 반환합니다. 반면 인증/권한 계층은 **객체를 반환합니다** - `{"error": {"message": "…", "type": "…", "hint": "…"}}` (이는 위의 권한/잘못된 워크스페이스 `404` 의 경우와, 누락되었거나 잘못된 키 `401`에 대해 받게 되는 것입니다). 소비자 코드는 **두** 형식을 모두 처리하도록 작성하세요.
{% endhint %}

흔한 함정 하나: 단순히 경로의 스코프가 없는 요청은 **`404`**&#xB97C; 반환하며, `403`를 반환하지 않습니다.  `403` 은 호출이 *는* 키를 관리할 수 있도록 허용되었지만 호출자가 가진 것보다 더 많은 것을 배포하려 했음을 의미합니다.

참조: [오류 및 상태 코드](/reference/ko/errors-and-status-codes.md) 일반 오류 형식은

## CLI

해당 `roboflow api-key` 명령 그룹을 사용하면 터미널에서 워크스페이스의 API 키를 관리할 수 있습니다. 이는 [API 키 REST 엔드포인트](#http-api) 를 감싸며, CLI 설정의 워크스페이스와 자격 증명을 사용합니다(참조: [CLI 설치 및 설정](/reference/ko/platform/cli/install-and-set-up-the-cli.md)).

{% hint style="info" %}
전체 비밀 값은 **오직** 키를 생성할 때 한 번 표시됩니다. 즉시 저장하세요. list/get으로는 다시 표시되지 않습니다.
{% endhint %}

```bash
roboflow api-key --help
```

| 명령        | 설명                            |
| --------- | ----------------------------- |
| `list`    | 워크스페이스의 API 키를 나열합니다.         |
| `get`     | 하나의 키에 대한 세부 정보를 표시합니다.       |
| `생성`      | 새 키를 생성합니다(비밀 값은 한 번만 출력).    |
| `업데이트`    | 키의 이름, 스코프 또는 메타데이터를 업데이트합니다. |
| `protect` | 키를 보호됨으로 표시합니다.               |
| `disable` | 키를 비활성화하거나 다시 활성화합니다.         |
| `폐기`      | 키를 영구적으로 폐기합니다.               |
| `공개 가능`   | 워크스페이스의 퍼블리시 가능한 키를 출력합니다.    |

추가 `--json` (전역 플래그로, 명령 앞에 둡니다)를 추가해 스크립팅용 기계 판독 가능한 출력을 얻습니다. 예: `roboflow --json api-key list`.

### 키 나열

```bash
roboflow api-key list
roboflow api-key list --include-disabled --include-folders
```

### 하나의 키 가져오기

키는 다음으로 식별됩니다: `keyId` (비밀이 아닌 핸들로, 다음에 표시됩니다 `list`):

```bash
roboflow api-key get <key_id>
```

### 키 생성

```bash
# 호출 자격 증명의 스코프를 상속합니다(호출자가 전체 접근이면 전체 접근 키)
roboflow api-key create "my-app"

# 범위가 지정된 키(--scope 반복; Advanced API Keys 필요)
roboflow api-key create "inference-only" --scope model:infer

# 역할 프리셋 - RBAC 역할의 스코프를 부여합니다(기본 제공 또는 사용자 지정 역할 이름);
# 명시적 스코프와 조합할 수 있습니다. role:owner는 전체 접근을 의미합니다.
roboflow api-key create "reviewer-bot" --scope role:reviewer --scope model:infer

# 폴더 범위 지정 + 보호됨
roboflow api-key create "edge-device" --folder <folder_id> --protected

# 메타데이터 추가(--metadata 반복; Advanced API Keys 필요)
roboflow api-key create "ci-key" --metadata team=vision --metadata env=prod
```

비밀 값은 한 번만 출력됩니다. 스크립트에서 저장하려면 `--json` 를 사용하고 다음으로 पाइ프하세요 `jq`:

```bash
roboflow --json api-key create "ci-key" | jq -r .key > .env.key
```

{% hint style="warning" %}
`--scope`, `--folder` 및 `--metadata` 에는 Advanced API Keys 요금제 기능이 필요하며, 명령을 실행하는 자격 증명이 이미 보유한 권한만 부여할 수 있습니다.
{% endhint %}

### 키 업데이트

```bash
# 이름 변경
roboflow api-key update <key_id> --name "renamed-key"

# 키의 스코프 교체(--scope 반복)
roboflow api-key update <key_id> --scope model:infer --scope project:read

# 키의 메타데이터 교체(--metadata 반복)
roboflow api-key update <key_id> --metadata team=vision --metadata env=prod
```

`--scope` **대체합니다** 기존 스코프를 정확히 전달한 집합으로 바꾸고, `--metadata` 키의 메타데이터를 대체합니다. 다음을 전송하세요: `--name` 만 단독으로 보내면 둘 중 어느 것도 건드리지 않고 이름만 바꿀 수 있습니다.

{% hint style="warning" %}
스코프나 메타데이터를 변경하려면 **Advanced API Keys** 요금제 기능이 필요합니다(다음을 사용한 이름 변경은 `--name` 필요하지 않습니다). `생성`마찬가지로, 명령을 실행하는 자격 증명이 이미 보유한 스코프만 부여할 수 있습니다.
{% endhint %}

### 키 보호 / 보호 해제

```bash
roboflow api-key protect <key_id>
```

보호된 키는 CLI, API 또는 MCP를 통해 비활성화하거나 폐기할 수 없습니다. **보호 해제는** [**대시보드**](https://app.roboflow.com/settings/api) 에서만 수행할 수 있으며, 의도적으로 `unprotect` 명령은 없습니다. 따라서 자동화된 워크플로우가 한 단계로 안전 장치를 제거하고 프로덕션 키를 폐기할 수 없습니다.

### 키 비활성화 / 다시 활성화

```bash
roboflow api-key disable <key_id>            # 비활성화
roboflow api-key disable <key_id> --enable   # 다시 활성화
```

비활성화된 키는 API에서 거부되지만 다시 활성화할 수 있습니다. 보호된 키는 비활성화할 수 없습니다.

{% hint style="warning" %}
`roboflow api-key disable` (그리고 다음으로 다시 활성화 `--enable`)에는 **Advanced API Keys** 요금제 기능이 필요하며, 범위가 지정된 `생성` 로 `--scope`/`--folder`것과 동일합니다. 이는 [REST API](#update-an-api-key).
{% endhint %}

### 키 폐기

```bash
roboflow api-key revoke <key_id>          # 확인을 요청합니다
roboflow api-key revoke <key_id> --yes    # 프롬프트 건너뛰기(스크립트용)
```

폐기는 영구적입니다. 보호된 키는 CLI에서 폐기할 수 없습니다. 먼저 대시보드에서 보호 해제하세요.

### 퍼블리시 가능한 키 가져오기

```bash
roboflow api-key publishable
roboflow --json api-key publishable | jq -r .publishableKey
```

퍼블리시 가능한 키(`rf_<workspaceId>`)는 비밀이 아니며 브라우저 / [inferencejs](https://docs.roboflow.com/deployment/self-hosted/sdks/web-browser) 코드에 포함해도 안전합니다. 이는 추론 전용이며 생성하거나 폐기할 수 없습니다. 자세한 내용은 [공개 가능한 키](#the-publishable-key) 를 참조하세요.

## MCP 서버

AI 에이전트를 [MCP 서버](https://docs.roboflow.com/agents/mcp-server) 에 연결하면 이 도구들로 API 키를 관리할 수 있습니다:

<table data-search="false"><thead><tr><th width="290">도구</th><th>설명</th></tr></thead><tbody><tr><td><code>api_keys_list</code></td><td>워크스페이스의 모든 API 키를 나열합니다.</td></tr><tr><td><code>api_keys_get</code></td><td>단일 키의 메타데이터를 가져옵니다.</td></tr><tr><td><code>api_keys_get_publishable</code></td><td>워크스페이스의 퍼블리시 가능한 키를 가져옵니다.</td></tr><tr><td><code>api_keys_create</code></td><td>새 API 키를 생성합니다.</td></tr><tr><td><code>api_keys_update</code></td><td>키의 이름, 스코프 또는 메타데이터를 업데이트합니다.</td></tr><tr><td><code>api_keys_disable</code></td><td>폐기하지 않고 키를 비활성화하거나 다시 활성화합니다.</td></tr><tr><td><code>api_keys_revoke</code></td><td>키를 영구적으로 폐기합니다.</td></tr></tbody></table>
