인증
Bearer 토큰으로 API 키를 전송하세요. 이 엔드포인트는 명세에 특정 권한을 명시하지 않으므로, 가정하기보다는 키에 필요한 최소한의 권한을 부여하고 응답을 확인하세요.
조직 ID가 들어가는 위치
이 엔드포인트는 org_id을(를) 쿼리 매개변수로 사용합니다. 생략하면 테넌트 하위 트리 전체가 호출 대상이 되며, 값을 전달하면 특정 조직으로 호출 범위를 좁힐 수 있습니다.
조직 ID는 대시보드의 API 키 화면에서 키 바로 옆에 있습니다. 이는 실행하는 모든 호출에서 동일한 ID입니다.
무료 체험하기
대괄호 안에 있는 모든 내용을 사용자 지정 값으로 바꾸고, 키 플레이스홀더는 대시보드의 키로 바꾸세요.
curl -X GET https://api.zinndigital.com/v1/branding \
-H "Authorization: Bearer zdk_live_…"로그인하셨나요? 대시보드의 API 콘솔이 실제 조직 ID와 본인의 키를 자동으로 채우고 라이브 API를 대상으로 요청을 실행하므로 실제 응답을 확인할 수 있습니다. API 콘솔에서 이 엔드포인트를 여세요
상세 정보
The name, logo, colour and links the signed-in customer's dashboard paints itself with — their agency's or reseller's if they are white-labelled, otherwise Zinn®'s. **Always answers, for every authenticated caller.** An organisation with no brand of its own is not a `404`: it receives the platform identity with `is_white_label: false`. A nullable answer would make every client invent its own fallback, and the second such client is the leak this feature exists to close. Resolved by walking **up** the organisation tree to the org that owns the brand, and gated on the `white_label` entitlement held by that owner — never by the client reading it, who holds no such entitlement and never will. ⛔ Not gated on a permission key. This answers *"what does your screen look like?"*, not *"may you see this data?"* — the payload is the brand the caller is already looking at. It is still authenticated and org-scoped, so one tenant cannot ask what another tenant's panel looks like. **`Cache-Control: private, no-store`** — this response is never stored, by any cache, and that is a tenancy requirement rather than a tuning choice. The URL is `/v1/branding` for every tenant and the organisation travels in `X-Zinn-Org`, so a stored copy is keyed on nothing that separates one tenant from the next. It was `private, max-age=60` until 2026-08-26; `private` bounds a stored copy to one browser profile and **does not** bound it to one tenant, and one browser profile is exactly where an organisation switch happens. Measured before the change: four organisations, one token, one second apart, all four answering with the first one's brand. `Vary: X-Zinn-Org, Authorization` is sent as well, so an intermediary that stores despite `no-store` still cannot serve one tenant's brand to another.
매개변수
| 이름 | 유형 | 필수 | 설명 |
|---|---|---|---|
org_id (query) | string | 아니요 | Which of the caller's organisations to resolve for. Optional, and only needed by a person who belongs to several. `X-Zinn-Org` stands in for it when it is absent. Accepts **any… |
응답
| 이름 | 유형 | 필수 | 설명 |
|---|---|---|---|
name | string | 예 | The name shown in the page title, the sidebar header and the browser tab. |
dashboard_url | string | 예 | Where this brand's panel lives. The brand's own attached hostname when it has one, otherwise the platform panel — never a hostname that does not resolve yet, because a link the… |
support_url | string | 예 | — |
status_url | string | 예 | — |
logo_url | string | 예 | Empty when the brand has set no logo; the client then renders the name. |
primary_colour | string | 예 | Empty when the brand has set no colour; the client then uses its default. |
is_white_label | boolean | 예 | `false` for Zinn®'s own identity. Lets a surface say "this is white-labelled" without comparing the name to a literal. |
is_client_of_reseller | boolean | 예 | `true` only when this brand belongs to an organisation **above** yours — that is, you are a reseller's client rather than the reseller. ⛔ Not the same question as `is_white_labe… |
locales | string[] | 예 | The languages this panel may be shown in, in registry order. Every language we ship, unless the caller is a reseller's client and that reseller narrowed the list. Never empty. S… |
default_locale | string | 예 | The language a new account under this brand starts in. Always a member of `locales`. |
locales_restricted | boolean | 예 | `true` when a reseller narrowed the list, so a surface can explain why a language is missing instead of looking broken. |
language_switcher | boolean | 예 | `false` when the reseller has removed the language control from their clients' panel. Render no picker — not a disabled one. `locales` stays populated regardless: hiding a contr… |
currencies | string[] | 예 | The currencies this panel may quote in, in registry order. Every currency we can charge, unless the caller is a reseller's client and that reseller narrowed the list. Never empty. |
default_currency | string | 예 | What a viewer under this brand is quoted in before they choose. Always a member of `currencies`. |
currencies_restricted | boolean | 예 | `true` when a reseller narrowed the list, so a surface can explain why a currency is missing instead of looking broken. |
currency_switcher | boolean | 예 | `false` when the reseller has removed the currency control. Every client of that reseller is then quoted in `default_currency`. |
palette | object | 예 | Design-system colour tokens the brand chose, `{token: "#rrggbb"}`. **Empty for the platform**, which means *"use the design system's own"* — expressed as absence rather than as… |
font_stack | string | 예 | A complete CSS `font-family` value, fallbacks included. Never a bare family name: a brand whose webfont fails to load must land somewhere chosen, not on the browser's default se… |
font_css_url | string | 예 | A stylesheet installing a self-hosted Google family, or `""` for a catalogue font that needs no bytes. ⛔ Served from **our** origin, never `fonts.googleapis.com`. A `<link>` to… |
nav_position | string | 예 | — |
density | string | 예 | — |
corner_radius | string | 예 | — |
colour_scheme | string | 예 | The scheme a first visit lands on. |
favicon_url | string | 예 | The brand's icon, already falling back to its logo. Empty means *"leave whatever the surface has"* — never our mark, because on a reseller's hostname that is the leak. |
email_logo_url | string | 예 | The mark for transactional mail; falls back to the panel logo. |
menu_items | BrandNavLink[] | 예 | Custom navigation links the provider added, **already filtered** to what this reader may see. |
이 엔드포인트가 반환할 수 있는 오류
401 · 429