
# E-posta şablonu taslağını kaydet

`PUT /v1/email-templates/{family}/{locale}` · izin `email-templates:write` · Startup planı ve üstü

İçeriği yeni bir taslak sürüm olarak kaydeder. Taslağı [yayımlayana](publish.md) kadar yayımlanmış sürüm değişmez.

`If-Match` zorunludur ve okuduğunuz en yeni sürümü taşır ([al](get.md) ya da [sürümleri listele](list-versions.md) işlemlerinin `ETag`'i). Henüz sürümü olmayan bir yuva için `If-Match: "0"` gönderin; `*` boş bir yuvayla eşleşmez. Uyuşmazlık `412` döndürür.

Kaydetmeden önce içerik, gerçek gönderimle aynı denetimlerden geçer:

- Örnek verilerle Liquid sandbox'ında render edilebilmelidir.
- HTML dengeli olmalıdır.
- Ailenin kodu ya da bağlantısı (bkz. [listeden](list.md) `requires`) hem HTML'de hem düz metin gövdesinde bulunmalıdır.
- Bağlantılar yalnızca platform host'larına işaret edebilir.
- Boyut sınırları uygulanır.

Bir yuva, yayımlanmış sürüm dışında en fazla 50 sürüm tutar; daha eski taslaklar silinir.

## Yol parametreleri

| Parametre | Açıklama |
|---|---|
| `family` | E-posta ailesi, örneğin `verify_email` veya `email_otp` ([E-posta şablonlarını listele](list.md) bölümüne bakın). |
| `locale` | Dil etiketi, örneğin `en` veya `de`. |

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `subject` | string | evet | Liquid, düz metin, 1 ile 200 karakter, satır sonu yok. |
| `html` | string | evet | Liquid HTML parçası, en fazla 256 KiB. Platform düzeni ekler. |
| `text_body` | string | evet | Liquid düz metin gövdesi, en fazla 64 KiB. |
| `from_name` | string | hayır | Gönderen görünen adı, en fazla 64 karakter, satır sonu yok. Boş ya da eksikse uygulama veya ortam adı kullanılır. |

## Yanıt

`200 OK`, yeni taslak ve sürümüne eşit `ETag` ile.

```json
{
  "family": "verify_email",
  "locale": "en",
  "version": 3,
  "status": "draft",
  "subject": "Confirm your email for {{ application.name }}",
  "html": "<p>Hi,</p><p><a href=\"{{ link }}\">Confirm your email</a></p>",
  "text_body": "Confirm your email: {{ link }}",
  "from_name": null,
  "source_version": null,
  "created_at": "2026-10-19T09:00:00Z",
  "published_at": null,
  "latest_version": 3,
  "published_version": 2
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Gövdede bilinmeyen bir alan var ya da gövde bir JSON nesnesi değil. |
| 404 | `not_found` | Aile ya da dil bilinmiyor veya sürüm mevcut değil. |
| 403 | `plan_feature_unavailable` | Ortamın planı özel e-posta şablonlarını içermiyor (Startup ve üstü; hangisinin gerektiği `required_plan` alanında yazar). |
| 412 | `precondition_failed` | `If-Match`, en yeni sürüm değil (araya biri kaydetmiş) ya da boş bir yuvada `*`. |
| 413 | `payload_too_large` | Gövde 2 MiB'den büyük. |
| 428 | `precondition_required` | `If-Match` eksik. |
| 422 | `validation_failed` | İçerik doğrulamayı geçemiyor; `errors[]` her alanı (`/subject`, `/html`, `/text_body`, `/from_name`, `/family`) ve kuralını belirtir. |
| 422 | `template_forbidden_construct` | Şablon sandbox dışında bir Liquid yapısı kullanıyor (örneğin `{% include %}`); `errors[]` alanı adlandırır. |
| 401 | `unauthenticated` | Kimlik bilgisi eksik, geçersiz ya da iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisinin gerekli izni yok. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

`errors[]` içindeki doğrulama kuralları şunları içerir: `required`, `too_long`, `invalid`, `unbalanced_html`, `missing_code`, `missing_link`, `missing_code_or_link`, `template_render_failed`, `template_too_large` ve `family_not_available`.

## Örnek

```bash
curl -X PUT https://api.eu.keenauth.com/v1/email-templates/verify_email/en \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H 'If-Match: "2"' \
  -d '{"subject":"Confirm your email for {{ application.name }}","html":"<p><a href=\"{{ link }}\">Confirm your email</a></p>","text_body":"Confirm your email: {{ link }}"}'
```

CLI: `keenauth email-templates put verify_email en --if-match '"2"' --data @template.json`
