
# Définir le modèle de page

`PUT /v1/branding/page-template` · permission `branding:write`

Écrit le modèle de page Liquid du brouillon de l'environnement (plan Startup ou supérieur, fonctionnalité `branding_page_template`). Le modèle doit contenir l'emplacement `{{ idp.widget }}` exactement une fois ; il est compilé dans un bac à sable à l'écriture. Une chaîne vide l'efface.

## Requête

| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| `If-Match` | en-tête | oui | L'`ETag` du brouillon lu en dernier (`"0"` s'il n'a jamais été écrit). Absent : `428` ; périmé : `412`. |
| `page_template` | chaîne | oui | 102400 octets au plus ; `""` efface. |

## Réponse

`200 OK` avec le brouillon de l'environnement et son `ETag`. `theme` ne contient que les jetons définis ; les autres héritent de la valeur par défaut de la plateforme.

```json
{
  "theme": {"mode": "light", "light": {"color": {"primary": "#0a3d91"}}, "logo_height": 40},
  "css": null,
  "page_template": null,
  "updated_at": "2026-10-05T09:30:00.123456Z"
}
```

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 400 | `unknown_field` | Le corps contient un champ inconnu ou n'est pas un objet JSON. |
| 403 | `plan_feature_unavailable` | Le plan n'inclut pas la fonctionnalité (`plan_feature_unavailable`, extensions `feature` et `required_plan`). Les environnements de développement ne sont pas restreints. |
| 412 | `precondition_failed` | `If-Match` ne correspond pas à la version actuelle du brouillon. |
| 422 | `validation_failed` | `page_template` est absent ou `null` (`required`), ou trop long (`too_long`). |
| 422 | `template_forbidden_construct` | Le modèle utilise une construction interdite (par exemple `{% include %}` ou `<script>`), ou `{{ idp.widget }}` n'apparaît pas exactement une fois. |
| 428 | `precondition_required` | L'en-tête `If-Match` est absent. |
| 401 | `unauthenticated` | L'identifiant est absent, invalide ou révoqué. |
| 403 | `insufficient_permissions` | L'identifiant n'a pas la permission requise. |
| 429 | `rate_limited` | La limite de débit est dépassée ; réessayez après le délai `Retry-After`. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayez après le délai `Retry-After`. |

## Exemple

```bash
curl -X PUT https://api.eu.keenauth.com/v1/branding/page-template \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H 'If-Match: "3"' \
  -d '{"page_template":"<div class=\"shell\">{{ idp.widget }}</div>"}'
```
