
# Markalama varlığı yükle

`POST /v1/branding/assets` · izin `branding:write`

Barındırılan giriş sayfası için bir görsel yükler: logo, favicon ya da arka plan görseli. Yanıttaki `id`, tema alanlarına (`logo`, `favicon` ya da `background_image`) yazdığınız değerdir (bkz. [Markalamayı güncelle](./update.md)); görsel yayımladıktan sonra giriş sayfasında görünür.

Her görsel yalıtılmış bir süreçte çözülür ve en çok 1024 × 1024 piksel PNG olarak yeniden kodlanır; bütün meta veri atılır. Favicon için 32 px ve 180 px sürümler de üretilir. `id` işlenmiş PNG'nin SHA-256'sıdır; aynı görseli aynı alan için yeniden yüklemek var olan varlığı `200 OK` ile döndürür.

Kabul edilen biçimler PNG, JPEG ve WebP'dir; ICO yalnız favicon için kabul edilir. SVG kabul edilmez. Yazı tipi yükleme yoktur.

Bir ortamda en çok 200 varlık ve toplam 50 MB bulunabilir.

## İstek

Gövde `multipart/form-data`'dır; dosya en çok 1 MiB.

| Parça | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `kind` | string | evet | `logo`, `favicon` ya da `background_image`. |
| `file` | dosya | evet | Görsel. En çok 1 MiB ve bir kenarı en çok 8192 piksel. |

`Idempotency-Key` ile yinelenen istek, çok parçalı sınırlayıcı dahil aynı baytları göndermelidir.

## Yanıt

Yeni varlıkta `201 Created`; aynı görsel aynı alan için daha önce yüklendiyse `200 OK`.

```json
{
  "id": "3f0c…e91a",
  "kind": "favicon",
  "url": "https://acme.eu1.keenauth.app/assets/3f0c…e91a.png",
  "width": 256,
  "height": 256,
  "byte_size": 48213,
  "source_format": "ico",
  "favicon_32_url": "https://acme.eu1.keenauth.app/assets/9b1d…04c2.png",
  "favicon_180_url": "https://acme.eu1.keenauth.app/assets/c7e2…5a10.png",
  "created_at": "2026-10-19T20:30:00Z"
}
```

`byte_size`, varlığın saklanan bütün PNG'lerinin boyutudur ve kotaya sayılır.

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `malformed_request` | Çok parçalı gövde okunamıyor ya da bir `kind` ve bir `file` dışında parça var. |
| 401 | `unauthenticated` | Kimlik bilgisi yok, geçersiz ya da iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisinde gerekli izin yok. |
| 403 | `quota_exceeded` | Ortamda zaten 200 varlık ya da 50 MB var. |
| 413 | `payload_too_large` | Dosya 1 MiB'tan büyük. |
| 415 | `unsupported_media_type` | Gövde `multipart/form-data` değil ya da dosya kabul edilen bir biçimde değil (`errors[]` içinde `unsupported_media_type`, `svg_not_allowed`, `ico_favicon_only`). |
| 422 | `validation_failed` | `kind` ya da `file` eksik veya geçersiz (yazı tipinde `/kind font_upload_disabled`) ya da görsel kullanılamıyor: `invalid_image`, `image_too_large`, `image_dimensions_too_large`, `image_output_too_large`, `image_processing_limit`. |
| 422 | `idempotency_key_reuse` | Aynı `Idempotency-Key` farklı gövdeyle kullanıldı. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Varlık deposu geçici olarak erişilemiyor; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

```bash
curl -X POST https://api.eu.keenauth.com/v1/branding/assets \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -F kind=logo \
  -F file=@logo.png
```

CLI ile:

```bash
keenauth branding assets upload --kind logo --file logo.png
```
