Pubblicare la bozza di branding

POST /v1/branding:publish · permesso branding:write

Crea uno snapshot di tutte le bozze (ambiente, applicazioni, organizzazioni, testi) e lo rende la versione attiva delle pagine ospitate. Prima della pubblicazione viene verificato il tema effettivo di ogni ambito: token obbligatori, intervalli di valori e contrasto WCAG di ogni coppia di colori. Qualsiasi problema rifiuta l'intera pubblicazione con 422 branding_validation_failed e un elenco issues[] che indica ogni token da modificare (per il contrasto con il ratio misurato, la threshold e la suggestion conforme più vicina). Vengono conservate le ultime 50 versioni. Idempotency-Key è facoltativo.

Se la bozza contiene CSS personalizzato, viene anche visualizzato sulle schermate ospitate prima di qualsiasi pubblicazione (un controllo di rendering che può richiedere fino a 25 secondi; usare un timeout client di almeno 30 secondi). Il CSS che rompe un elemento protetto o aggiunge una violazione di accessibilità che la pagina non ha senza di esso rifiuta la pubblicazione con 422 branding_validation_failed e un elenco render_violations[]. Se la bozza cambia durante il controllo, non viene pubblicato nulla e si riceve 409 conflict; pubblicare di nuovo.

Richiesta

Questa operazione non accetta campi di percorso, query o corpo. L'ambiente deriva dalla credenziale.

Risposta

200 OK con i metadati della nuova versione (lo snapshot non viene restituito).

{
  "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"
}
{
  "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 rifiuto del controllo di rendering elenca ogni riscontro: screen (ad esempio password), locale (en, ar o ja), width (larghezza della viewport in pixel CSS, 320 o 1280), rule (protected_no_area, protected_not_visible, protected_transparent, protected_covered, protected_contrast oppure un ID di regola axe-core come color-contrast) e target (il nome dell'elemento protetto o un selettore CSS axe-core). I valori CSS non vengono mai restituiti. Vengono restituiti al massimo 100 riscontri; render_violations_truncated è true se ce n'erano di più.

{
  "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
}

Errori

HTTP code Quando
403 plan_feature_unavailable La bozza contiene CSS personalizzato o un modello di pagina non incluso nel piano (feature indica quale).
422 branding_validation_failed La bozza non può essere pubblicata; vedere issues[]. Il CSS personalizzato della bozza viene sanificato di nuovo alla pubblicazione; se non lo supera, le violazioni sono nell'estensione violations[] (vedere PUT /v1/branding/css). Se il CSS personalizzato non supera il controllo di rendering, i riscontri sono in render_violations[] e render_violations_truncated.
409 conflict La bozza è cambiata mentre il suo CSS personalizzato veniva controllato; non è stato pubblicato nulla. Pubblicare di nuovo.
401 unauthenticated La credenziale manca, non è valida o è stata revocata.
403 insufficient_permissions La credenziale non ha il permesso richiesto.
429 rate_limited Il limite di frequenza è stato superato; riprovare dopo il periodo Retry-After.
503 service_unavailable Una dipendenza è temporaneamente non disponibile (incluso il controllo di rendering di una bozza con CSS personalizzato); riprovare dopo il periodo Retry-After.

Esempio

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