Get Portal Branding
GET/api/admin/portal/branding
Get the merchant's resolved portal branding: the stored colours, display name, support email and uploaded logo / mark, with every unset value filled in from the SKU defaults and the derived text colours, contrast ratios and warnings computed.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
Response (data): logo_url, mark_url (null when none uploaded), display_name (the merchant's chosen name, else the default store's company name / store name, else the app name), display_name_is_default (true when no name was set), primary_color, nav_color (uppercase #RRGGBB; SKU defaults #0096DD / #1F2937 when unset), on_primary_color, on_nav_color (the readable text colour for each: #FFFFFF or #111827, whichever contrasts more; the unbranded defaults keep white text), primary_contrast, nav_contrast (WCAG 2.x contrast ratio of that text colour, one decimal, rounded down), support_email, version (bumped on every branding write; append it to image URLs to bust caches) and warnings (array of {field, code, ratio, message}). Warning codes: low_contrast (a merchant-chosen colour where even the better text colour is under 4.5:1) and low_contrast_on_page (a primary colour under 3:1 against the white page, since links, chips and focus rings use it). Warnings never block a save.
Requires a staff bearer token with the portal.manage permission.
Request
Responses
- 200
- 401
- 403
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.