> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adrop.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 타겟팅

> 문맥 타겟팅 API로 문맥 타겟팅을 조회, 생성, 이름 변경, 삭제하는 방법을 안내합니다.

타겟팅에는 광고주가 캠페인을 예약할 때 고르는 타겟팅 옵션이 들어 있습니다. 이 페이지의 엔드포인트로 타겟팅을 관리할 수 있습니다. 타겟팅 안의 옵션을 관리하려면 [타겟팅 옵션](/ko/integrations/context-targeting/options)을 참고하세요.

* 조회 엔드포인트에는 `context-targeting:read` 권한이, 쓰기 엔드포인트에는 `context-targeting:write` 권한이 필요합니다. [사전 준비](/ko/integrations/context-targeting/overview#사전-준비)를 참고하세요.
* API 키로 프로젝트가 정해지므로 경로에는 프로젝트 ID가 들어가지 않습니다.
* 각 엔드포인트에는 그 엔드포인트에서만 발생하는 오류를 적었습니다. 모든 엔드포인트에 공통으로 적용되는 오류는 [오류 코드](/ko/integrations/context-targeting/errors#오류-코드)를 참고하세요.

***

## 타겟팅 객체

타겟팅 목록 조회, 타겟팅 조회, 생성, 이름 변경 엔드포인트는 다음 형식으로 타겟팅을 반환합니다. 삭제 엔드포인트는 `_id`만 반환합니다. API 필드에서는 옵션을 `categories`라고 부릅니다.

| 필드 | 타입 | 설명 |
| - | - | - |
| `_id` | string | 타겟팅 ID(26자 ULID). 서버가 생성합니다. |
| `name` | string | 타겟팅 이름 |
| `categories` | object\[] | 옵션 그룹과 그 하위 옵션을 포함한 타겟팅의 모든 옵션. 각 항목은 [옵션 객체](/ko/integrations/context-targeting/options#옵션-객체)이며, 컨텍스트 ID 개수(`contextCount`)는 있지만 컨텍스트 ID 자체는 들어 있지 않습니다. |
| `categoryCount` | number | 하위 옵션을 포함한 타겟팅의 옵션 수. 항상 포함됩니다. |
| `syncedAt` | number | 이 타겟팅을 광고 송출용으로 가장 최근에 로드하기 시작한 시각(epoch 밀리초). 이 시각과 같거나 그 이전에 성공한 변경은 로드된 것입니다. |
| `createdAt` | string | 타겟팅을 생성한 시각(ISO 8601, UTC) |
| `updatedAt` | string | 타겟팅을 마지막으로 수정한 시각(ISO 8601, UTC). 타겟팅을 광고 송출용으로 로드할 때도 바뀝니다. |

`categories`와 `syncedAt`은 응답에 따라 포함 여부가 다릅니다.

| 응답 | `categories` | `syncedAt` |
| - | - | - |
| [타겟팅 목록 조회](#타겟팅-목록-조회), [타겟팅 조회](#타겟팅-조회) | 기본으로 포함됩니다. `includeCategories=false`로 요청하면 생략됩니다. | 값이 있으면 포함됩니다 |
| [타겟팅 생성](#타겟팅-생성), [타겟팅 일괄 생성](#타겟팅-일괄-생성) | 포함됩니다 | 새 타겟팅은 아직 로드되지 않았으므로 생략됩니다 |
| [타겟팅 이름 변경](#타겟팅-이름-변경), [타겟팅 이름 일괄 변경](#타겟팅-이름-일괄-변경) | 생략됩니다 | 값이 있으면 포함됩니다 |

`syncedAt`은 타겟팅의 첫 로드가 끝날 때까지 생략됩니다. 컨텍스트 ID를 변경하거나 옵션을 추가·이동·분리한 뒤에도 보통 다음 로드가 끝날 때까지 생략됩니다.

<Note>
  변경 사항이 로드됐는지 확인하려면 변경에 성공한 시각과 `syncedAt`을 비교하세요. `syncedAt`이 있는지 없는지로 판단하지 마세요. [변경 반영 시점](/ko/integrations/context-targeting/overview#변경-반영-시점)을 참고하세요.
</Note>

***

## 타겟팅 목록 조회

프로젝트의 모든 문맥 타겟팅을 페이지 나눔 없이 한 번에 반환합니다. 오디언스 타겟팅은 포함되지 않습니다.

### 요청

```http theme={null}
GET /context-targeting
```

`context-targeting:read` 권한이 필요합니다.

### 쿼리 파라미터

| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
| - | - | :-: | - | - |
| `includeCategories` | boolean | - | `true` | `categories`를 포함할지 여부. `false`로 보내면 `categories`는 생략되지만, 옵션 수는 `categoryCount`로 계속 확인할 수 있습니다. 옵션이 많은 타겟팅에는 `false`를 쓰고, 옵션은 [옵션 목록 조회](/ko/integrations/context-targeting/options#옵션-목록-조회)로 페이지 단위로 읽으세요. `true`와 `false` 외의 값을 보내면 `400`을 반환합니다. |

### 요청 예시

```bash theme={null}
curl "https://lake.adrop.io/context-targeting?includeCategories=false" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

### 응답 예시

`200` 응답으로 [타겟팅 객체](#타겟팅-객체) 배열을 반환합니다.

```json theme={null}
[
  {
    "_id": "01JAB3XK5Q8V7M2N4P6R9T0W1Y",
    "name": "News Sections",
    "categoryCount": 2,
    "syncedAt": 1791854650000,
    "createdAt": "2026-10-13T01:23:45.000Z",
    "updatedAt": "2026-10-13T01:24:12.000Z"
  }
]
```

***

## 타겟팅 조회

문맥 타겟팅 하나를 반환합니다.

### 요청

```http theme={null}
GET /context-targeting/{targetingId}
```

`context-targeting:read` 권한이 필요합니다.

### 경로 파라미터

| 파라미터 | 타입 | 필수 | 설명 |
| - | - | :-: | - |
| `targetingId` | string | O | 타겟팅 ID |

### 쿼리 파라미터

| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
| - | - | :-: | - | - |
| `includeCategories` | boolean | - | `true` | `categories`를 포함할지 여부. `false`로 보내면 `categories`는 생략되지만, 옵션 수는 `categoryCount`로 계속 확인할 수 있습니다. `true`와 `false` 외의 값을 보내면 `400`을 반환합니다. |

### 요청 예시

```bash theme={null}
curl "https://lake.adrop.io/context-targeting/01JAB3XK5Q8V7M2N4P6R9T0W1Y" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

### 응답 예시

`200` 응답으로 [타겟팅 객체](#타겟팅-객체)를 반환합니다.

```json theme={null}
{
  "_id": "01JAB3XK5Q8V7M2N4P6R9T0W1Y",
  "name": "News Sections",
  "categories": [
    {
      "_id": "01JAB3XK5RA1B2C3D4E5F6G7H8",
      "name": "Sports",
      "type": "atomic",
      "contextCount": 3,
      "createdAt": "2026-10-13T01:23:45.000Z",
      "updatedAt": "2026-10-13T01:23:45.000Z"
    },
    {
      "_id": "01JAB3XK5RA1B2C3D4E5F6G7H9",
      "name": "Tech",
      "type": "atomic",
      "contextCount": 3,
      "createdAt": "2026-10-13T01:23:45.000Z",
      "updatedAt": "2026-10-13T01:23:45.000Z"
    }
  ],
  "categoryCount": 2,
  "syncedAt": 1791854650000,
  "createdAt": "2026-10-13T01:23:45.000Z",
  "updatedAt": "2026-10-13T01:24:12.000Z"
}
```

옵션의 컨텍스트 ID를 읽으려면 [옵션 조회](/ko/integrations/context-targeting/options#옵션-조회)를 사용하세요.

**오류**

| 상태 | `errorCode` | 발생 조건 |
| - | - | - |
| 404 | `TARGETING_NOT_FOUND` | 프로젝트에 이 ID의 문맥 타겟팅이 없습니다. 오디언스 타겟팅의 ID를 보내도 이 오류가 발생합니다. |

***

## 타겟팅 생성

문맥 타겟팅을 생성합니다. 같은 요청에서 옵션도 함께 만들 수 있습니다.

### 요청

```http theme={null}
POST /context-targeting
```

`context-targeting:write` 권한이 필요합니다.

### 요청 본문

| 필드 | 타입 | 필수 | 기본값 | 설명 |
| - | - | :-: | - | - |
| `name` | string | O | — | 타겟팅 이름(2\~36자). 오디언스 타겟팅을 포함한 프로젝트의 모든 타겟팅 사이에서 고유해야 합니다. [이름 규칙](/ko/integrations/context-targeting/errors#이름-규칙)을 참고하세요. |
| `categories` | object\[] | - | — | 타겟팅과 함께 만들 옵션. 하위 옵션을 포함해 요청당 최대 100개입니다. |

`categories`의 각 항목에는 다음 필드를 씁니다.

| 필드 | 타입 | 필수 | 기본값 | 설명 |
| - | - | :-: | - | - |
| `name` | string | O | — | 옵션 이름(2\~36자). 옵션 그룹과 하위 옵션을 포함해 타겟팅 안에서 고유해야 합니다. |
| `contexts` | string\[] | - | — | 옵션의 컨텍스트 ID. 옵션 그룹이면 옵션 그룹 자체의 컨텍스트 ID입니다. [컨텍스트 ID 규칙](/ko/integrations/context-targeting/options#컨텍스트-id-규칙)을 참고하세요. |
| `type` | string | - | 설명 참고 | `atomic`(일반 옵션) 또는 `collection`. 생략하면 `children`이 있을 때는 빈 배열이어도 옵션 그룹이 되고, 그렇지 않으면 `atomic`이 됩니다. |
| `children` | object\[] | - | — | 옵션 그룹 전용. 함께 만들 하위 옵션이며, 각 항목에 `name`(필수)과 `contexts`를 씁니다. |
| `exposeChildren` | boolean | - | `false` | 옵션 그룹 전용. 하위 옵션을 광고주에게 노출할지 여부. [하위 옵션을 광고주에게 노출](/ko/integrations/context-targeting/option-groups#하위-옵션을-광고주에게-노출)을 참고하세요. |

* 한 요청에 넣을 수 있는 컨텍스트 ID는 하위 옵션의 컨텍스트 ID를 포함해 모두 합쳐 최대 10,000개입니다.
* 모든 ID는 서버가 생성합니다. `_id`를 넣은 요청은 `400`으로 실패합니다.
* `categories`의 항목에는 `parent`를 넣을 수 없습니다. 넣으면 요청이 `400`으로 실패합니다. 기존 옵션 그룹에 옵션을 추가하려면 [옵션 그룹에 옵션 추가](/ko/integrations/context-targeting/option-groups#옵션-그룹에-옵션-추가)를 참고하세요.
* 옵션을 100개보다 많이 만들려면 먼저 타겟팅을 만든 뒤 [옵션 일괄 추가](/ko/integrations/context-targeting/options#옵션-일괄-추가)를 사용하세요.

옵션 그룹의 동작 방식은 [옵션 그룹 만들기](/ko/integrations/context-targeting/option-groups#옵션-그룹-만들기)를 참고하세요.

### 요청 예시

```bash theme={null}
curl -X POST https://lake.adrop.io/context-targeting \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "News Sections",
    "categories": [
      { "name": "Sports", "contexts": ["sport", "baseball", "soccer"] },
      { "name": "Tech", "contexts": ["tech", "ai", "mobile"] }
    ]
  }'
```

### 응답 예시

`201` 응답으로 옵션이 포함된 새 [타겟팅 객체](#타겟팅-객체)를 반환합니다.

```json theme={null}
{
  "_id": "01JAB3XK5Q8V7M2N4P6R9T0W1Y",
  "name": "News Sections",
  "categories": [
    {
      "_id": "01JAB3XK5RA1B2C3D4E5F6G7H8",
      "name": "Sports",
      "type": "atomic",
      "contextCount": 3,
      "createdAt": "2026-10-13T01:23:45.000Z",
      "updatedAt": "2026-10-13T01:23:45.000Z"
    },
    {
      "_id": "01JAB3XK5RA1B2C3D4E5F6G7H9",
      "name": "Tech",
      "type": "atomic",
      "contextCount": 3,
      "createdAt": "2026-10-13T01:23:45.000Z",
      "updatedAt": "2026-10-13T01:23:45.000Z"
    }
  ],
  "categoryCount": 2,
  "createdAt": "2026-10-13T01:23:45.000Z",
  "updatedAt": "2026-10-13T01:23:45.000Z"
}
```

타겟팅과 각 옵션의 `_id`를 저장해 두세요. 나중에 타겟팅을 변경할 때 필요합니다.

**오류**

| 상태 | `errorCode` | 발생 조건 |
| - | - | - |
| 409 | `TARGETING_NAME_DUPLICATE` | 프로젝트에 `name`과 같은 이름의 타겟팅이 이미 있습니다. 그 타겟팅이 문맥 타겟팅이면 `detail.existingId`에 그 ID가 들어 있습니다. 그렇지 않으면 `detail`이 생략됩니다. |
| 409 | `TARGETING_CATEGORY_NAME_DUPLICATE` | `categories`에서 하위 옵션을 포함한 두 옵션의 이름이 같습니다. |
| 400 | `TARGETING_CATEGORY_NOT_SUPPORTED` | 옵션의 필드가 유형과 맞지 않습니다. 예를 들어 옵션 그룹에 하위 옵션도 자체 컨텍스트 ID도 없거나, `type: "atomic"`과 함께 `children`을 보냈거나, 일반 옵션에 `exposeChildren`을 보낸 경우입니다. 타겟팅은 생성되지 않습니다. |
| 400 | `TARGETING_CONTEXT_LIMIT_EXCEEDED` | 프로젝트의 전체 컨텍스트 ID 수가 한도를 넘게 됩니다. [한도](/ko/integrations/context-targeting/errors#한도)를 참고하세요. |
| 400 | `TARGETING_COLLECTION_CONTEXT_DUPLICATED` | 옵션 그룹 자체의 컨텍스트 ID가 프로젝트나 같은 요청에 있는 다른 옵션 그룹의 자체 컨텍스트 ID로 이미 쓰이고 있습니다. `detail.conflicts`에 중복된 항목이 나열됩니다. [제약 사항](/ko/integrations/context-targeting/option-groups#제약-사항)을 참고하세요. |

이름이 이미 사용 중이면 다음과 같이 응답합니다.

```json theme={null}
{
  "statusCode": 409,
  "errorCode": "TARGETING_NAME_DUPLICATE",
  "detail": {
    "existingId": "01JAB3XK5Q8V7M2N4P6R9T0W1Y"
  }
}
```

<Tip>
  생성 요청은 멱등(idempotent)하지 않습니다. 생성 요청이 타임아웃되거나 `5xx` 오류로 실패하면 다시 보내도 됩니다. 첫 요청이 이미 성공했다면 다시 보낸 요청은 `409 TARGETING_NAME_DUPLICATE`로 실패하며, `detail.existingId`에 첫 요청이 만든 타겟팅의 ID가 들어 있습니다. [재시도와 중복 요청](/ko/integrations/context-targeting/errors#재시도와-중복-요청)을 참고하세요.
</Tip>

***

## 타겟팅 이름 변경

타겟팅의 이름을 변경합니다. 옵션과 컨텍스트 ID는 바뀌지 않습니다.

### 요청

```http theme={null}
PATCH /context-targeting/{targetingId}
```

`context-targeting:write` 권한이 필요합니다.

### 경로 파라미터

| 파라미터 | 타입 | 필수 | 설명 |
| - | - | :-: | - |
| `targetingId` | string | O | 타겟팅 ID |

### 요청 본문

| 필드 | 타입 | 필수 | 설명 |
| - | - | :-: | - |
| `name` | string | O | 새 타겟팅 이름(2\~36자). 오디언스 타겟팅을 포함한 프로젝트의 모든 타겟팅 사이에서 고유해야 합니다. 현재 이름을 그대로 보내도 됩니다. [이름 규칙](/ko/integrations/context-targeting/errors#이름-규칙)을 참고하세요. |

### 요청 예시

```bash theme={null}
curl -X PATCH https://lake.adrop.io/context-targeting/01JAB3XK5Q8V7M2N4P6R9T0W1Y \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Article Sections" }'
```

### 응답 예시

`200` 응답으로 이름이 바뀐 [타겟팅 객체](#타겟팅-객체)를 `categories` 없이 반환합니다. 옵션을 읽으려면 [타겟팅 조회](#타겟팅-조회)나 [옵션 목록 조회](/ko/integrations/context-targeting/options#옵션-목록-조회)를 사용하세요.

```json theme={null}
{
  "_id": "01JAB3XK5Q8V7M2N4P6R9T0W1Y",
  "name": "Article Sections",
  "categoryCount": 2,
  "syncedAt": 1791854650000,
  "createdAt": "2026-10-13T01:23:45.000Z",
  "updatedAt": "2026-10-13T02:10:00.000Z"
}
```

**오류**

| 상태 | `errorCode` | 발생 조건 |
| - | - | - |
| 404 | `TARGETING_NOT_FOUND` | 프로젝트에 이 ID의 문맥 타겟팅이 없습니다. |
| 409 | `TARGETING_NAME_DUPLICATE` | 프로젝트의 다른 타겟팅이 이미 `name`과 같은 이름을 쓰고 있습니다. 그 타겟팅이 문맥 타겟팅이면 `detail.existingId`에 그 ID가 들어 있습니다. |

***

## 타겟팅 삭제

타겟팅과 그 안의 모든 옵션(옵션 그룹과 하위 옵션 포함)을 삭제합니다.

<Warning>
  승인되었고 아직 종료되지 않은 캠페인이 타겟팅의 옵션을 하나라도 포함하거나 제외하고 있으면 타겟팅을 삭제할 수 없습니다. 요청은 `400 TARGETING_LOCKED`로 실패하고, 아무것도 삭제되지 않습니다. 옵션을 하나씩 삭제할 때는 이 제한이 적용되지 않습니다. [옵션 삭제](/ko/integrations/context-targeting/options#옵션-삭제)를 참고하세요.
</Warning>

### 요청

```http theme={null}
DELETE /context-targeting/{targetingId}
```

`context-targeting:write` 권한이 필요합니다.

### 경로 파라미터

| 파라미터 | 타입 | 필수 | 설명 |
| - | - | :-: | - |
| `targetingId` | string | O | 삭제할 타겟팅 ID |

### 요청 예시

```bash theme={null}
curl -X DELETE https://lake.adrop.io/context-targeting/01JAB3XK5Q8V7M2N4P6R9T0W1Y \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

### 응답 예시

`200` 응답으로 삭제된 타겟팅의 ID만 반환합니다.

```json theme={null}
{
  "_id": "01JAB3XK5Q8V7M2N4P6R9T0W1Y"
}
```

**오류**

| 상태 | `errorCode` | 발생 조건 |
| - | - | - |
| 404 | `TARGETING_NOT_FOUND` | 프로젝트에 이 ID의 문맥 타겟팅이 없습니다. 이미 성공한 삭제 요청을 다시 보낸 경우라면 타겟팅은 이미 삭제된 상태입니다. |
| 400 | `TARGETING_LOCKED` | 승인되었고 아직 종료되지 않은 캠페인이 타겟팅의 옵션 중 하나를 포함하거나 제외하고 있습니다. |

***

## 일괄 작업

요청 한 번으로 타겟팅을 최대 100개까지 생성, 이름 변경, 삭제할 수 있습니다.

* 먼저 요청 전체를 검사합니다. 항목 수(1\~100개), 각 필드의 형식, 요청당 합계를 확인합니다. 검사를 통과하지 못하면 요청 전체가 `400`으로 실패하고 아무것도 적용되지 않습니다.
* 프로젝트의 다른 API 쓰기 요청이 처리 중이면 요청 전체가 `409 CONTEXT_TARGETING_WRITE_IN_PROGRESS`로 실패할 수 있으며, 이때 아무것도 적용되지 않습니다. [동시 쓰기](/ko/integrations/context-targeting/errors#동시-쓰기)를 참고하세요.
* 그 밖의 경우에는 모든 항목이 실패하더라도 `200` 응답으로 항목별 결과를 반환합니다. 일부 항목만 성공하고 나머지는 실패할 수 있으므로 항목마다 `success`를 확인하세요.

| 필드 | 타입 | 설명 |
| - | - | - |
| `results` | object\[] | 항목별 결과(요청 순서대로 항목마다 하나씩) |
| `results[].index` | number | 요청의 `items` 또는 `ids`에서 항목의 위치(0부터 시작) |
| `results[].success` | boolean | 항목의 성공 여부 |
| `results[].data` | object | 성공한 항목의 결과. 실패한 항목에서는 생략됩니다. |
| `results[].error` | object | 실패한 항목의 오류. `statusCode`, `errorCode`와 일부 오류에서는 `detail`이 들어 있습니다. 성공한 항목에서는 생략됩니다. |
| `succeeded` | number | 성공한 항목 수 |
| `failed` | number | 실패한 항목 수 |

생성과 삭제 요청은 검사를 통과한 항목을 한꺼번에 적용합니다. 예기치 않은 오류가 발생하면 요청의 어떤 항목도 적용되지 않습니다. 이때 검사에서 실패한 항목은 원래 오류를 그대로 받고, 나머지 항목은 `500 UNCATCHED`로 실패합니다. 같은 요청을 다시 보내세요. 이름 변경 요청은 항목을 요청 순서대로 하나씩 따로 적용합니다. 자세한 내용은 [일괄 작업 응답](/ko/integrations/context-targeting/errors#일괄-작업-응답)을 참고하세요.

### 타겟팅 일괄 생성

타겟팅을 최대 100개까지 생성하며, 타겟팅마다 옵션은 함께 만들어도 되고 만들지 않아도 됩니다.

#### 요청

```http theme={null}
POST /context-targeting/bulk/create
```

`context-targeting:write` 권한이 필요합니다.

#### 요청 본문

| 필드 | 타입 | 필수 | 설명 |
| - | - | :-: | - |
| `items` | object\[] | O | 생성할 타겟팅(1\~100개). 각 항목에는 [타겟팅 생성](#타겟팅-생성)의 요청 본문과 같은 필드를 씁니다. |

한 요청의 모든 항목을 합쳐 옵션은 하위 옵션을 포함해 최대 100개, 컨텍스트 ID는 최대 10,000개까지 넣을 수 있습니다.

#### 요청 예시

```bash theme={null}
curl -X POST https://lake.adrop.io/context-targeting/bulk/create \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "Video Sections",
        "categories": [
          { "name": "Highlights", "contexts": ["highlight", "replay"] }
        ]
      },
      {
        "name": "Podcast Sections",
        "categories": [
          { "name": "Interviews", "contexts": ["interview", "talk"] }
        ]
      },
      { "name": "News Sections" }
    ]
  }'
```

#### 응답 예시

성공한 항목의 `data`는 옵션이 포함된 새 [타겟팅 객체](#타겟팅-객체)입니다. 이 예시에서 세 번째 항목은 "News Sections"라는 이름의 타겟팅이 이미 있어서 실패합니다.

```json theme={null}
{
  "results": [
    {
      "index": 0,
      "success": true,
      "data": {
        "_id": "01JAB3XK5WE1F2G3H4J5K6M7N8",
        "name": "Video Sections",
        "categories": [
          {
            "_id": "01JAB3XK5XF1G2H3J4K5M6N7P8",
            "name": "Highlights",
            "type": "atomic",
            "contextCount": 2,
            "createdAt": "2026-10-13T02:20:00.000Z",
            "updatedAt": "2026-10-13T02:20:00.000Z"
          }
        ],
        "categoryCount": 1,
        "createdAt": "2026-10-13T02:20:00.000Z",
        "updatedAt": "2026-10-13T02:20:00.000Z"
      }
    },
    {
      "index": 1,
      "success": true,
      "data": {
        "_id": "01JAB3XK5WE1F2G3H4J5K6M7N9",
        "name": "Podcast Sections",
        "categories": [
          {
            "_id": "01JAB3XK5XF1G2H3J4K5M6N7P9",
            "name": "Interviews",
            "type": "atomic",
            "contextCount": 2,
            "createdAt": "2026-10-13T02:20:00.000Z",
            "updatedAt": "2026-10-13T02:20:00.000Z"
          }
        ],
        "categoryCount": 1,
        "createdAt": "2026-10-13T02:20:00.000Z",
        "updatedAt": "2026-10-13T02:20:00.000Z"
      }
    },
    {
      "index": 2,
      "success": false,
      "error": {
        "statusCode": 409,
        "errorCode": "TARGETING_NAME_DUPLICATE",
        "detail": {
          "existingId": "01JAB3XK5Q8V7M2N4P6R9T0W1Y"
        }
      }
    }
  ],
  "succeeded": 2,
  "failed": 1
}
```

각 항목은 [타겟팅 생성](#타겟팅-생성)과 같은 오류로 실패합니다. 같은 요청의 앞선 항목이 만든 타겟팅과 이름이 겹치면 `TARGETING_NAME_DUPLICATE`에는 `detail.existingId` 대신 그 항목의 인덱스인 `detail.duplicateOfIndex`가 들어 있습니다.

### 타겟팅 이름 일괄 변경

타겟팅 최대 100개의 이름을 변경합니다.

#### 요청

```http theme={null}
POST /context-targeting/bulk/update
```

`context-targeting:write` 권한이 필요합니다.

#### 요청 본문

| 필드 | 타입 | 필수 | 설명 |
| - | - | :-: | - |
| `items` | object\[] | O | 이름을 변경할 타겟팅(1\~100개) |
| `items[]._id` | string | O | 타겟팅 ID |
| `items[].name` | string | O | 새 타겟팅 이름. [타겟팅 이름 변경](#타겟팅-이름-변경)과 같은 규칙을 따릅니다. |

#### 요청 예시

```bash theme={null}
curl -X POST https://lake.adrop.io/context-targeting/bulk/update \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "_id": "01JAB3XK5Q8V7M2N4P6R9T0W1Y", "name": "Article Sections" }
    ]
  }'
```

#### 응답 예시

성공한 항목의 `data`는 이름이 바뀐 [타겟팅 객체](#타겟팅-객체)이며, `categories`는 들어 있지 않습니다.

```json theme={null}
{
  "results": [
    {
      "index": 0,
      "success": true,
      "data": {
        "_id": "01JAB3XK5Q8V7M2N4P6R9T0W1Y",
        "name": "Article Sections",
        "categoryCount": 2,
        "syncedAt": 1791854650000,
        "createdAt": "2026-10-13T01:23:45.000Z",
        "updatedAt": "2026-10-13T02:10:00.000Z"
      }
    }
  ],
  "succeeded": 1,
  "failed": 0
}
```

각 항목은 [타겟팅 이름 변경](#타겟팅-이름-변경)과 같은 오류로 실패합니다.

### 타겟팅 일괄 삭제

타겟팅 최대 100개와 그 안의 모든 옵션을 삭제합니다.

#### 요청

```http theme={null}
POST /context-targeting/bulk/delete
```

`context-targeting:write` 권한이 필요합니다.

#### 요청 본문

| 필드 | 타입 | 필수 | 설명 |
| - | - | :-: | - |
| `ids` | string\[] | O | 삭제할 타겟팅 ID(1\~100개) |

#### 요청 예시

```bash theme={null}
curl -X POST https://lake.adrop.io/context-targeting/bulk/delete \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": ["01JAB3XK5Q8V7M2N4P6R9T0W1Y"]
  }'
```

#### 응답 예시

성공한 항목의 `data`에는 삭제된 타겟팅의 `_id`만 들어 있습니다. 이 예시에서는 승인되었고 아직 종료되지 않은 캠페인이 타겟팅의 옵션 하나를 포함하고 있어 타겟팅이 삭제되지 않습니다.

```json theme={null}
{
  "results": [
    {
      "index": 0,
      "success": false,
      "error": {
        "statusCode": 400,
        "errorCode": "TARGETING_LOCKED"
      }
    }
  ],
  "succeeded": 0,
  "failed": 1
}
```

각 항목은 [타겟팅 삭제](#타겟팅-삭제)와 같은 오류로 실패합니다.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.