Portal design
Make the partner portal on your own domain look and read like your product: colours with a dark scheme, fonts, logos, the header and footer, the home page, navigation, the sign-in page, wording, custom CSS, and embedding it in your app.
Your partners use the portal on your own domain (partners.yourapp.com, see Hosted pages). There it runs your consent banner, your support chat and your sign-in. Portal design decides how it looks and reads.
Design it in the dashboard under Portal design, or over the API. Every setting is optional: anything you leave unset keeps the standard look.
Draft, preview, publish
You always edit a draft. Partners keep seeing the published design until you publish.
Call | What it does |
|---|---|
|
|
| Merges into the draft: objects key by key, lists and values replace, |
| Replaces the whole draft |
| A link that shows the draft on your domain for 7 days, to anyone who has it |
| Makes the draft live (within a minute) and keeps it as a version |
| Every published version, and a way back |
| Every key, as JSON Schema |
| A design-tokens |
An unknown key is refused with a 422 that names its full path (chrome.footer.colums), so a write never quietly changes nothing.
curl -X PATCH https://referalli.com/v1/portal/theme/draft \
-H "Authorization: Bearer $REFERALLI_API_KEY" -H "Content-Type: application/json" \
-d '{
"primaryColor": "#4f46e5",
"paletteDark": { "background": "#0b1020", "primary": "#818cf8" },
"bodyFontFamily": "Inter",
"customFontUrl": "https://fonts.googleapis.com/css2?family=Inter:wght@400;600",
"portal": { "navigation": { "hidden": ["financing", "marketplace"] } },
"chrome": { "footer": { "showPoweredBy": false } }
}'What you can set
Area | Keys |
|---|---|
Brand |
|
Colours |
|
Type |
|
Layout |
|
Shape |
|
Header and footer |
|
Sign-in page |
|
Wording |
|
Phones |
|
Escape hatches |
|
Custom CSS is sanitised: no @import, nothing that could leave the stylesheet or run script. It only reaches your portal domain. The settings above are meant to make it unnecessary, so prefer them.
Fonts and images may come from any https host. The portal's Content-Security-Policy adds your font hosts by itself, including both Google Fonts hosts.
Embed the portal in your app
Turn on embed to show the portal inside your own app in an iframe:
{ "embed": { "enabled": true, "allowedOrigins": ["https://app.yourapp.com"], "hideChrome": true } }Only the origins you list may frame the portal (frame-ancestors). hideChrome drops the portal's own header and footer inside the frame, so it reads as part of your app. Sign partners in with your own session through the JWT method in Partner sign-in with your identity.
The portal's sign-in cookie is SameSite=Lax. Keep the portal domain on the same site as your app (partners.yourapp.com inside app.yourapp.com). Browsers don't send the cookie to a frame from another site.
Brand files
POST /v1/portal/theme/import-brand takes a W3C design-tokens file, either as document or as an https url. It reads color.primary, color.background, color.surface, color.text, color.muted, color.border, the status colours, font.body, font.heading, font.mono, font.url, radius.base, logo.url and brand.name. The answer lists the tokens it applied, in applied.