사용자 정의 CSS 설정

PUT /v1/branding/css · 권한 branding:write

환경 초안의 사용자 정의 CSS를 씁니다(Startup 이상 플랜, 기능 branding_custom_css). CSS는 허용 목록 정제기를 거칩니다. ui_catalog 클래스(idp-*)와 허용된 속성 및 값만 사용할 수 있으며, 보호 계층(법적 고지, 동의 및 접근성 요소)은 숨기거나 덮을 수 없습니다. 전부 아니면 전무: 위반이 하나라도 있으면 아무것도 쓰지 않습니다. 초안에는 보낸 텍스트가 아니라 정제기의 정규화된 출력이 저장되며, 응답의 css가 그 출력입니다. 빈 문자열은 지우며 플랜 제한을 받지 않습니다.

요청

필드 유형 필수 설명
If-Match 헤더 예 마지막으로 읽은 초안의 ETag (한 번도 쓰지 않았다면 "0"). 없으면 428, 오래되었으면 412.
css 문자열 예 최대 51200바이트, 유효한 UTF-8. ""은 지웁니다.

응답

200 OK와 환경 초안 및 ETag. theme에는 설정된 토큰만 있으며, 설정되지 않은 토큰은 플랫폼 기본값을 상속합니다.

{
  "theme": {"mode": "light", "light": {"color": {"primary": "#0a3d91"}}, "logo_height": 40},
  "css": ".idp-c .idp-title{color:#0a3d91}\n",
  "page_template": null,
  "updated_at": "2026-10-05T09:30:00.123456Z"
}

오류

HTTP code 조건
400 unknown_field 본문에 알 수 없는 필드가 있거나 JSON 객체가 아닙니다.
403 plan_feature_unavailable 플랜에 기능이 포함되어 있지 않습니다(plan_feature_unavailable, 확장 feature와 required_plan). 개발 환경은 제한되지 않습니다.
412 precondition_failed If-Match가 초안의 현재 버전과 일치하지 않습니다.
422 validation_failed css가 없거나 null이거나(required), 너무 길거나(too_long), 유효한 UTF-8이 아닙니다(invalid_utf8).
422 branding_validation_failed CSS가 정제기를 통과하지 못했습니다. violations 확장에 모든 위반이 나열됩니다: line, column(1부터 시작), rule(예: class_not_in_catalog, protected_property, property_not_allowed, syntax_error), 있는 경우 name(속성, 클래스 또는 함수 이름). CSS 값은 응답에 포함되지 않습니다. 위반이 100개를 넘으면 정제기가 멈추며 마지막 항목의 규칙은 too_many_issues입니다. 정규화된 출력은 입력보다 깁니다(모든 규칙에 범위 접두사가 붙음). 51200바이트를 넘으면 유일한 위반은 1행 1열의 too_large 규칙입니다.
428 precondition_required If-Match 헤더가 없습니다.
401 unauthenticated 자격 증명이 없거나 유효하지 않거나 폐기되었습니다.
403 insufficient_permissions 자격 증명에 필요한 권한이 없습니다.
429 rate_limited 속도 제한을 초과했습니다. Retry-After 기간 후에 다시 시도하세요.
503 service_unavailable 종속 서비스를 일시적으로 사용할 수 없습니다. Retry-After 기간 후에 다시 시도하세요.

정제기 거부 예:

.idp-button{position:fixed}
.my-banner{color:red}
{
  "type": "https://docs.keenauth.com/errors/branding_validation_failed",
  "title": "Branding validation failed",
  "status": 422,
  "code": "branding_validation_failed",
  "violations": [
    {"line": 1, "column": 13, "rule": "property_not_allowed", "name": "position"},
    {"line": 2, "column": 1, "rule": "class_not_in_catalog", "name": "my-banner"}
  ],
  "request_id": "req_01J9Z3N5W8Q2F6V4K7T1M0XB3C"
}

예제

curl -X PUT https://api.eu.keenauth.com/v1/branding/css \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H 'If-Match: "3"' \
  -d '{"css":".idp-title { color: #0a3d91 }"}'