
# メールテンプレートの下書きを保存

`PUT /v1/email-templates/{family}/{locale}` · 権限 `email-templates:write` · Startup プラン以上

内容を新しい下書きバージョンとして保存します。下書きを[公開](publish.md)するまで、公開済みのバージョンは変わりません。

`If-Match` は必須で、読み取った最新バージョンを指定します（[取得](get.md)または[バージョン一覧](list-versions.md)の `ETag`）。まだバージョンがないスロットには `If-Match: "0"` を送信してください。`*` は空のスロットには一致しません。一致しない場合は `412` が返されます。

保存する前に、内容は実際の送信と同じチェックを通過する必要があります:

- サンプルデータを使って Liquid サンドボックスでレンダリングできること。
- HTML のタグの対応が正しいこと。
- ファミリーのコードまたはリンク（[一覧](list.md)の `requires` を参照）が、HTML とプレーンテキスト本文の両方に含まれること。
- リンクはプラットフォームのホストのみを指すこと。
- サイズ制限に従うこと。

スロットは公開済みのバージョンに加えて最大 50 件のバージョンを保持します。それより古い下書きは削除されます。

## パスパラメーター

| パラメーター | 説明 |
|---|---|
| `family` | メールファミリー。例: `verify_email` または `email_otp`（[メールテンプレートを一覧表示](list.md)を参照）。 |
| `locale` | ロケールタグ。例: `en` または `de`。 |

## リクエスト

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `subject` | string | はい | Liquid、プレーンテキスト、1〜200 文字、改行なし。 |
| `html` | string | はい | Liquid の HTML 断片、最大 256 KiB。レイアウトはプラットフォームが追加します。 |
| `text_body` | string | はい | Liquid のプレーンテキスト本文、最大 64 KiB。 |
| `from_name` | string | いいえ | 送信者の表示名、最大 64 文字、改行なし。空または省略時はアプリケーション名または環境名を使用します。 |

## レスポンス

`200 OK`。新しい下書きと、そのバージョンに設定された `ETag` を返します。

```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
}
```

## エラー

| HTTP | code | 発生条件 |
|---|---|---|
| 400 | `unknown_field` | 本文に未知のフィールドがあるか、JSON オブジェクトではありません。 |
| 404 | `not_found` | ファミリーまたはロケールが不明、またはバージョンが存在しません。 |
| 403 | `plan_feature_unavailable` | 環境のプランにカスタムメールテンプレートが含まれていません（Startup 以上。必要なプランは `required_plan` に示されます）。 |
| 412 | `precondition_failed` | `If-Match` が最新バージョンではない（その間に別のユーザーが保存した）、または空のスロットに `*` を指定しました。 |
| 413 | `payload_too_large` | 本文が 2 MiB を超えています。 |
| 428 | `precondition_required` | `If-Match` がありません。 |
| 422 | `validation_failed` | 内容が検証に失敗しました。`errors[]` に各フィールド（`/subject`、`/html`、`/text_body`、`/from_name`、`/family`）と規則が示されます。 |
| 422 | `template_forbidden_construct` | テンプレートがサンドボックス外の Liquid 構文を使用しています（例: `{% include %}`）。`errors[]` にフィールドが示されます。 |
| 401 | `unauthenticated` | 資格情報がない、無効、または取り消されています。 |
| 403 | `insufficient_permissions` | 資格情報に必要な権限がありません。 |
| 429 | `rate_limited` | レート制限を超えました。`Retry-After` の期間が過ぎてから再試行してください。 |
| 503 | `service_unavailable` | 依存先が一時的に利用できません。`Retry-After` の期間が過ぎてから再試行してください。 |

`errors[]` に含まれる検証規則は、`required`、`too_long`、`invalid`、`unbalanced_html`、`missing_code`、`missing_link`、`missing_code_or_link`、`template_render_failed`、`template_too_large`、`family_not_available` です。

## 例

```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`
