
# Publish an email template

`POST /v1/email-templates/{family}/{locale}:publish` · permission `email-templates:write` · Startup plan and above

Validates a draft again and publishes it. The previous published version is archived, and the management audit record `email_template.published` is written in the same transaction. Emails sent after this use the new version.

Publishing the version that is already published changes nothing and returns it again, so retries are safe. A draft older than the published version, or an archived version, returns `409`; use [roll back](rollback.md) to return to an archived version.

## Path parameters

| Parameter | Description |
|---|---|
| `family` | Email family, for example `verify_email` or `email_otp` (see [List email templates](list.md)). |
| `locale` | Locale tag, for example `en` or `de`. |

## Request

| Field | Type | Required | Description |
|---|---|---|---|
| `version` | integer | yes | The draft version to publish (1 or more). |

## Response

`200 OK` with the published version (`status: published`).

## Errors

| HTTP | code | When |
|---|---|---|
| 400 | `unknown_field` | The body has an unknown field or is not a JSON object. |
| 404 | `not_found` | The family or locale is unknown, or the version does not exist. |
| 403 | `plan_feature_unavailable` | The environment's plan does not include custom email templates (Startup and above; `required_plan` says which). |
| 409 | `conflict` | The version is archived or older than the published version. |
| 422 | `validation_failed` | `version` is missing or less than 1, or the draft no longer passes validation. |
| 401 | `unauthenticated` | The credential is missing, invalid or revoked. |
| 403 | `insufficient_permissions` | The credential lacks the required permission. |
| 429 | `rate_limited` | The rate limit was exceeded; retry after the `Retry-After` period. |
| 503 | `service_unavailable` | A dependency is temporarily unavailable; retry after the `Retry-After` period. |

## Example

```bash
curl -X POST https://api.eu.keenauth.com/v1/email-templates/verify_email/en:publish \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"version":3}'
```

CLI: `keenauth email-templates publish verify_email en --version 3`
