
# 애플리케이션 테마 교체

`PUT /v1/branding/applications/{application_id}` · 권한 `branding:write`

범위의 테마 초안 전체를 교체합니다. 본문에 없는 토큰은 지워집니다. `{"theme":{}}`는 범위를 비웁니다. `If-Match`에는 환경이 아니라 이 범위의 `ETag`(해당 GET에서 받은 값)를 보냅니다.

## 요청

| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
| `application_id` | 경로 | 예 | `app_…` ID. |
| `If-Match` | 헤더 | 예 | 마지막으로 읽은 초안의 `ETag` (한 번도 쓰지 않았다면 `"0"`). 없으면 `428`, 오래되었으면 `412`. |
| `theme` | 객체 | 예 | 범위의 전체 `BrandingTheme`. |

## 응답

`200 OK`와 범위의 테마 초안 및 `ETag` (범위마다 별도 버전이 있습니다).

```json
{
  "theme": {"logo": "logo_acme", "light": {"color": {"primary": "#0a3d91"}}},
  "updated_at": "2026-10-05T09:30:00.123456Z"
}
```

## 오류

| HTTP | code | 조건 |
|---|---|---|
| 400 | `unknown_field` | 본문에 알 수 없는 필드가 있거나 JSON 객체가 아닙니다. |
| 404 | `not_found` | 이 환경에 애플리케이션이 없거나 ID 형식이 잘못되었습니다. |
| 412 | `precondition_failed` | `If-Match`가 초안의 현재 버전과 일치하지 않습니다. |
| 422 | `validation_failed` | 토큰 값이 유효하지 않습니다(`invalid_value`, `out_of_range`, `unknown_token`). `pointer`가 토큰을 가리킵니다(예: `/theme/light/color/primary`). |
| 428 | `precondition_required` | `If-Match` 헤더가 없습니다. |
| 401 | `unauthenticated` | 자격 증명이 없거나 유효하지 않거나 폐기되었습니다. |
| 403 | `insufficient_permissions` | 자격 증명에 필요한 권한이 없습니다. |
| 429 | `rate_limited` | 속도 제한을 초과했습니다. `Retry-After` 기간 후에 다시 시도하세요. |
| 503 | `service_unavailable` | 종속 서비스를 일시적으로 사용할 수 없습니다. `Retry-After` 기간 후에 다시 시도하세요. |

## 예제

```bash
curl -X PUT https://api.eu.keenauth.com/v1/branding/applications/app_01jbexample0000000000000000 \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H 'If-Match: "1"' \
  -d '{"theme":{"logo":"logo_acme","light":{"color":{"primary":"#0a3d91"}}}}'
```
