
# Publier le brouillon d'image de marque

`POST /v1/branding:publish` · permission `branding:write`

Prend un instantané de tous les brouillons (environnement, applications, organisations, textes) et en fait la version en ligne des pages hébergées. Avant publication, le thème effectif de chaque portée est vérifié : jetons obligatoires, plages de valeurs et contraste WCAG de chaque paire de couleurs. Tout problème rejette toute la publication avec `422 branding_validation_failed` et une liste `issues[]` qui nomme chaque jeton à modifier (avec le `ratio` mesuré, le `threshold` et une `suggestion` conforme la plus proche pour le contraste). Les 50 dernières versions sont conservées. `Idempotency-Key` est facultatif.

Lorsque le brouillon contient du CSS personnalisé, il est aussi rendu sur les écrans hébergés avant toute publication (une vérification de rendu qui peut durer jusqu'à 25 secondes ; utilisez un délai client d'au moins 30 secondes). Le CSS qui casse un élément protégé ou ajoute une violation d'accessibilité que la page n'a pas sans lui rejette la publication avec `422 branding_validation_failed` et une liste `render_violations[]`. Si le brouillon change pendant la vérification, rien n'est publié et vous recevez `409 conflict` ; publiez à nouveau.

## Requête

Cette opération ne prend aucun champ de chemin, de requête ou de corps. L'environnement provient de l'identifiant.

## Réponse

`200 OK` avec les métadonnées de la nouvelle version (l'instantané lui-même n'est pas renvoyé).

```json
{
  "version": 4,
  "snapshot_sha256": "3f1c…",
  "source": "publish",
  "rolled_back_from": null,
  "actor_type": "api_key",
  "actor_id": "key_01jb…",
  "published_at": "2026-10-05T09:31:00Z"
}
```

```json
{
  "type": "https://docs.keenauth.com/problems/branding_validation_failed",
  "status": 422,
  "code": "branding_validation_failed",
  "issues": [
    {"scope_type": "environment", "code": "brand_contrast_insufficient", "field": "light.color.primary_contrast",
     "variant": "light", "pair": "primary_contrast_on_primary", "ratio": 2.1, "threshold": 4.5, "suggestion": "#ffffff"}
  ]
}
```

Un rejet de la vérification de rendu liste chaque constat : `screen` (par exemple `password`), `locale` (`en`, `ar` ou `ja`), `width` (largeur de la fenêtre en pixels CSS, 320 ou 1280), `rule` (`protected_no_area`, `protected_not_visible`, `protected_transparent`, `protected_covered`, `protected_contrast`, ou un identifiant de règle axe-core tel que `color-contrast`) et `target` (le nom de l'élément protégé ou un sélecteur CSS axe-core). Les valeurs CSS ne sont jamais renvoyées. Au plus 100 constats sont renvoyés ; `render_violations_truncated` vaut `true` s'il y en avait davantage.

```json
{
  "type": "https://docs.keenauth.com/errors/branding_validation_failed",
  "status": 422,
  "code": "branding_validation_failed",
  "render_violations": [
    {"screen": "recovery", "locale": "ar", "width": 320, "rule": "protected_covered", "target": "recovery_codes_hint"}
  ],
  "render_violations_truncated": false
}
```

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 403 | `plan_feature_unavailable` | Le brouillon contient du CSS personnalisé ou un modèle de page que le plan n'inclut pas (`feature` indique lequel). |
| 422 | `branding_validation_failed` | Le brouillon ne peut pas être publié ; voir `issues[]`. Le CSS personnalisé du brouillon est assaini à nouveau à la publication ; en cas d'échec, les violations figurent dans l'extension `violations[]` (voir `PUT /v1/branding/css`). Si le CSS personnalisé échoue à la vérification de rendu, les constats figurent dans `render_violations[]` et `render_violations_truncated`. |
| 409 | `conflict` | Le brouillon a changé pendant la vérification de son CSS personnalisé ; rien n'a été publié. Publiez à nouveau. |
| 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 (y compris la vérification de rendu d'un brouillon avec CSS personnalisé) ; réessayez après le délai `Retry-After`. |

## Exemple

```bash
curl -X POST https://api.eu.keenauth.com/v1/branding:publish \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
```
