
# List email templates

`GET /v1/email-templates` · permission `email-templates:read`

Returns every customizable email family in plan order, with the locales that have versions. The list is fixed and not paginated (`list_metadata` cursors are always `null`). Reading works on every plan.

Each family tells you what a template must contain:

- `security`: the platform adds a security block the template cannot remove.
- `requires`: the value the message must show in both the HTML and the plain-text body: `code`, `link`, `code_or_link` or `none`.
- `available`: `false` means the family has no system template in this release yet, so drafts are refused.
- `variables`: the Liquid variables the template may use.

## Response

`200 OK`

```json
{
  "data": [
    {
      "family": "verify_email",
      "security": false,
      "requires": "code_or_link",
      "available": true,
      "variables": ["application.name", "code", "dir", "environment.display_name", "expires_in_minutes", "link", "locale", "support_url", "user.email"],
      "locales": [{"locale": "en", "latest_version": 3, "published_version": 2}]
    }
  ],
  "list_metadata": {"before": null, "after": null}
}
```

## Errors

| HTTP | code | When |
|---|---|---|
| 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 https://api.eu.keenauth.com/v1/email-templates \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

CLI: `keenauth email-templates list`
