Skip to content

A page of a portal's brand book

GET
/api/v1/portal/{slug}/site
curl --request GET \
--url http://localhost:3000/api/v1/portal/example/site

A page of one of the portal’s brands, from its latest publish (never the draft), as this visitor may read it, behind the same door as the portal. path is what follows /p/{slug}: nothing for the first brand’s first page, {page} for a page of the first brand (else another brand’s first page), {brand}/{page}. Pages above the visitor (portal.level) are listed with a lock and carry nothing; sections above them and hidden ones are left out. Every asset URL comes signed. redirect: the path was an old slug or a long form, so send the reader to canonical. A portal showing no brand answers view: null.

No key needed.

slug
required
string

The portal’s address

path
string

The portal path, e.g. logo or other-brand/logo

context
string

The context the reader starts in, e.g. dark-background

lang
string

The reader’s language, a lowercase tag: ar, en-gb

in
string

A collection section’s id, whose assets find narrows

find
string

Words a reader searches that collection section for

The page

Media typeapplication/json
object
data
required
object
portal
required
object
slug
required
string
name
required
string
theme
required

The portal’s own look, for its header: pages wear their brand’s

object
logo
required

A URL on this host: the portal’s, else its first brand’s mark, else its organization’s

string | null
accent
required

The portal’s, else its first brand’s color, else its organization’s

string | null
background
required
string | null
icon
required

The organization’s, for the browser tab

string | null
product
required

What the organization calls the product

string
site
required

Footer, quick grab and terms; an asset in quick grab comes with href, signed to download

object
footer
object
text

Markdown

string
<= 2000 characters
links
Array<object>
<= 8 items
object
label
required
string
>= 1 characters <= 60 characters
href
required
string
<= 2000 characters
credit
string
<= 120 characters
feedback

A URL or mailto:

string
<= 2000 characters
quick

Quick grab: pinned links in the header

Array<object>
<= 6 items
object
label
required
string
>= 1 characters <= 40 characters
brand

With page: a brand the portal carries; the first when left out

string
<= 60 characters
page
string
<= 60 characters /^[a-z0-9]+(-[a-z0-9]+)*$/
asset
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
href
string
<= 2000 characters
terms

Markdown readers accept once before their first download

string
<= 10000 characters
listed

Search engines may index it; public portals only

boolean
brands
required

The brands it shows, in order; one never published is left out

Array<object>
object
slug
required
string
name
required
string
publishedAt
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
assets
required

It shows collections: its Assets view

boolean
madeWith
required

Its pages carry “Powered by Artbucket”: a public portal whose organization’s plan has no white-label

boolean
level
required

Who the visitor is to it: everyone, partners (its password or an approved request) or members

string
Allowed values: everyone partners members
canonical
required

The page’s path on the portal, what links use; null with no page

string | null
redirect
required

The path asked was an old slug or a long form: send the reader to canonical

boolean
view
required
Any of:
object
brand
required
object
slug
required
string
name
required
string
version
required
Any of:
object
number
required
integer
>= -9007199254740991 <= 9007199254740991
publishedAt
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
context
required
string | null
contexts
required

Every context some rule is scoped to

Array<string>
lang
required
string | null
theme
required

The look, derived and graded, and the settings it came from

object
v1
required

The accent, lifted for light and dark pages, and the faces, as before W3

object
key
additional properties
surface
required
Any of:

A hex color

string
panel
required

A hex color

string
dark
required

A hex color

string
ink
required

A hex color

string
muted
required

A hex color

string
onDark
required

A hex color

string
mutedOnDark
required

A hex color

string
accent
required

The fill, as the brand has it: bands and buttons

string
accentText
required

The accent where it is text (links), at 4.5:1 on the surface

string
onAccent
required

A hex color

string
accentUse
required
string
Allowed values: fill hairline
line
required

A hex color

string
faces
required
object
head
object
family
required
string
weight
number
file

The font file for its weight

string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
files

Every font file of the rule, one @font-face each

Array<object>
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
filename
required
string
mime
required
string
fallback
string
google

From Google Fonts, with no files here yet: set in its fallback until they are imported

boolean
body
object
family
required
string
weight
number
file

The font file for its weight

string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
files

Every font file of the rule, one @font-face each

Array<object>
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
filename
required
string
mime
required
string
fallback
string
google

From Google Fonts, with no files here yet: set in its fallback until they are imported

boolean
label
object
family
required
string
weight
number
file

The font file for its weight

string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
files

Every font file of the rule, one @font-face each

Array<object>
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
filename
required
string
mime
required
string
fallback
string
google

From Google Fonts, with no files here yet: set in its fallback until they are imported

boolean
case
required
string
tracking
required

In em

number
radius
required
number
width
required
string
Allowed values: narrow normal wide
density
required
string
Allowed values: compact normal airy
scale
required
number
device
required
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
logo
required
Any of:
object
key
required
string
nav
required
string
Allowed values: sidebar top overlay
band
required

Header is band

boolean
header
required
string
Allowed values: plain band split
separation
required
string
Allowed values: space hairline
numbering
required
boolean
motion
required
string
Allowed values: none subtle
toc
required

On this page: a side column, a list under the page header, or none

string
Allowed values: side inline none
checks
required

Contrast of each pair in the look: one that fails falls back to a color that reads, and says which

Array<object>
object
pair
required

Which color on which, e.g. ink on surface

string
fg
required
string
bg
required
string
ratio
required
number
need
required

The contrast it must reach: 4.5 for text, 3 for marks

number
ok
required
boolean
used
required

The color used: fg when it passes, else its fallback

string
settings
required
object
accent
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
accentUse

Hairline: the accent draws rules and marks, never fills

string
Allowed values: fill hairline
surface
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
panel
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
dark
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
ink
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
muted
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
head
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
body
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
label
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
logo
Any of:
string
<= 120 characters /^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$/
device
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
radius

Corner radius in px

integer
<= 40
width
string
Allowed values: narrow normal wide
density
string
Allowed values: compact normal airy
scale

Heading size ratio; 1.25 when left out

number
>= 1.067 <= 1.618
nav
string
Allowed values: sidebar top overlay
band

Every page opens on a band of the brand color; header band says the same

boolean
header

A page’s opening: on the page, on a band of the brand color, or beside its cover

string
Allowed values: plain band split
separation

Between two sections on the page’s own ground: space alone, or a hairline too

string
Allowed values: space hairline
numbering

Number chapters and pages: 01, 01.2

boolean
motion

Subtle: sections reveal as they scroll in; never with reduced motion

string
Allowed values: none subtle
toc

On this page: a side column, a list under the page header, or hidden

string
Allowed values: side inline none
titles

Section titles: headings (medium), or headlines (large, huge); a section’s own size wins

string
Allowed values: medium large huge
grounds

Alternate: every other section on the page’s own ground sits on the panel, so a long page has rhythm; canvas: under its header the page sits on the panel, dotted like a whiteboard, its section titles centered

string
Allowed values: plain alternate canvas
languages

The languages readers pick from; the first is the one the pages are written in

Array<object>
<= 12 items
object
code
required
string
<= 20 characters /^[a-z]{2,3}(-[a-z0-9]{2,8})?$/
label
required
string
>= 1 characters <= 40 characters
dir

From the language when left out

string
Allowed values: ltr rtl
links

Links beside search and print on the brand’s pages: its repository, its Figma library, its site

Array<object>
<= 8 items
object
label
required
string
>= 1 characters <= 40 characters
url
required

Http or https; a link to GitHub, Figma, npm and the like shows its icon

string format: uri
<= 2000 characters
nav
required

Every page the reader is listed, in order

Array<object>
object
slug
required
string
title
required
string
parent
required

The page it sits under; null at the top

string | null
position
required
integer
>= -9007199254740991 <= 9007199254740991
eyebrow
required
string | null
lede
required
string | null
cover
required
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
icon
required
string | null
audience
required

On portals: who may read it

string
Allowed values: everyone partners members
tabs
required

Its child pages show as tabs across its top

boolean
home
required

The first page, opening on a cover: never numbered

boolean
locked
required

Above the reader: listed by title with a lock, nothing more

boolean
updatedAt
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
page
required
Any of:
object
slug
required
string
title
required
string
parent
required

The page it sits under; null at the top

string | null
position
required
integer
>= -9007199254740991 <= 9007199254740991
eyebrow
required
string | null
lede
required
string | null
cover
required
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
icon
required
string | null
audience
required

On portals: who may read it

string
Allowed values: everyone partners members
tabs
required

Its child pages show as tabs across its top

boolean
home
required

The first page, opening on a cover: never numbered

boolean
updatedAt
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
sections
required

What the reader gets: hidden ones for editors only

Array<object>
object
id
required
string
template
required

GET /api/v1/brand/templates lists them

string
title
required
string
body
required

Markdown

string
width
required
string
Allowed values: text wide full
columns
required
integer
>= -9007199254740991 <= 9007199254740991
tone
required

Its ground: plain, tint, brand, panel, dark, color, image or pattern

string
hidden
required
boolean
keys
required

The rules it shows, by key, in order

Array<string>
props
required

Its template’s own settings

object
key
additional properties
eyebrow
string
lede
string
aside

Markdown

string
tab

Sections sharing a tab name show under one tab

string
background
object
color
string
to
string
angle
number
image
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
scrim
number
items
Array<object>

A thing a template lists: a do or a don’t with its picture, a picture in a gallery

object
key

A rule it shows

string
asset
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
title
string
text

Markdown

string
verdict
string
Allowed values: do dont
caption
string
link
string
label
string
icon
string
download

False: for reference, never offered as a download

boolean
audience
string
Allowed values: everyone partners members
contexts

A tab per context, its rules resolved for each

Array<string>
only

Shown only in this context

string
translations

Its words by language tag; readers get them already in their language

object
key
additional properties
object
title
string
<= 300 characters
eyebrow
string
<= 120 characters
lede
string
<= 1000 characters
body
string
<= 20000 characters
aside
string
<= 4000 characters
items
Array
<= 60 items
Any of:
object
title
string
<= 200 characters
text
string
<= 4000 characters
caption
string
<= 500 characters
aliases
required
Array<string>
layout
required

Landing: a front with no nav column, on-this-page or pager; book: a chapter

string
Allowed values: book landing
locked
required
boolean
redirect

An old slug was asked for: the page’s slug now

string
rules
required

Every context version of the rules the page binds, the theme’s, and those their specs name

Array<object>
object
key
required

Dotted, e.g. color.primary

string
label
required

The heading readers see; null: the key, in words

string | null
context
required

Null: the default

string | null
type
required
string
Allowed values: color text number list font
value
required
Any of:
string
spec
required
Any of:
object
key
additional properties
usage
required
string | null
assets
required

Its assets readers may see, in order; one that may not be used is left out

Array<object>
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
rendition
required
string | null
title
required
string | null
filename
required
string
mime
required
string
width
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
height
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
size
required
integer
>= -9007199254740991 <= 9007199254740991
preview
required

Has renditions: /a/{id}/{rendition} draws it

boolean
media
required

The assets it names that may be used, by id

object
key
additional properties
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
filename
required
string
title
required
string | null
description
required
string | null
creator
required
string | null
copyright
required
string | null
mime
required
string
size
required
integer
>= -9007199254740991 <= 9007199254740991
width
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
height
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
thumbnail
required

A URL on this host

string | null
preview
required

Larger, for a closer look

string | null
downloads
required
Array<object>
object
preset
required
string
Allowed values: web social story print png original
label
required
string
hint
required
string
url
required
string
filename
required
string
original
required

The file as uploaded

string
focus
required
Any of:
object
x
required
number
y
required
number
updatedAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
collections
required

A collection section’s assets, by section id

object
key
additional properties
object
items
required
Array<object>
object
id
required
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
filename
required
string
title
required
string | null
description
required
string | null
creator
required
string | null
copyright
required
string | null
mime
required
string
size
required
integer
>= -9007199254740991 <= 9007199254740991
width
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
height
required
Any of:
integer
>= -9007199254740991 <= 9007199254740991
thumbnail
required

A URL on this host

string | null
preview
required

Larger, for a closer look

string | null
downloads
required
Array<object>
object
preset
required
string
Allowed values: web social story print png original
label
required
string
hint
required
string
url
required
string
filename
required
string
original
required

The file as uploaded

string
focus
required
Any of:
object
x
required
number
y
required
number
updatedAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
total
required
integer
>= -9007199254740991 <= 9007199254740991
error
required

Why it shows nothing; editors only

string | null
updates

With an updates section: the latest publishes, newest first, as many as its largest limit

Array<object>
object
version
required
integer
>= -9007199254740991 <= 9007199254740991
publishedAt
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
publishedBy
required
string | null
note
required

What changed, in the publisher’s words

string | null
image
required
Any of:
string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/
changes
required

What it changed for readers since the publish before it

object
rules
required

By key

object
added
required
Array<string>
changed
required
Array<string>
removed
required
Array<string>
pages
required

Pages readers can reach: a hidden one is left out

object
added
required
Array<object>
object
slug
required
string
title
required
string
changed
required
Array<object>
object
slug
required
string
title
required
string
removed
required
Array<object>
object
slug
required
string
title
required
string
signed
required

Signatures by asset id, for visitors; empty for members

object
key
additional properties
string
warnings
required

Editors only: what a reader would trip on, assets they won’t see, and theme pairs that fell back

Array<string>
missing
required

Editors only: keys a section binds with no rule

Array<string>
Example
{
"data": {
"portal": {
"level": "everyone"
},
"view": {
"theme": {
"accentUse": "fill",
"faces": {
"head": {
"google": true
},
"body": {
"google": true
},
"label": {
"google": true
}
},
"width": "narrow",
"density": "compact",
"nav": "sidebar",
"header": "plain",
"separation": "space",
"motion": "none",
"toc": "side",
"settings": {
"accentUse": "fill",
"width": "narrow",
"density": "compact",
"nav": "sidebar",
"header": "plain",
"separation": "space",
"motion": "none",
"toc": "side",
"titles": "medium",
"grounds": "plain",
"languages": [
{
"dir": "ltr"
}
]
}
},
"nav": [
{
"audience": "everyone"
}
],
"page": {
"audience": "everyone",
"sections": [
{
"width": "text",
"items": [
{
"verdict": "do"
}
],
"audience": "everyone"
}
],
"layout": "book"
},
"rules": [
{
"type": "color"
}
],
"media": {
"additionalProperty": {
"downloads": [
{
"preset": "web"
}
]
}
},
"collections": {
"additionalProperty": {
"items": [
{
"downloads": [
{
"preset": "web"
}
]
}
]
}
}
}
}
}

Not in yet: how to get in

Media typeapplication/json
object
error
required
object
code
required
string
Allowed value: password
message
required
string
detail
required
object
name
required
string
access
required
string
Allowed values: password members
theme
required
object
logo
required

A URL on this host: the portal’s, else its first brand’s mark, else its organization’s

string | null
accent
required

The portal’s, else its first brand’s color, else its organization’s

string | null
background
required
string | null
icon
required

The organization’s, for the browser tab

string | null
product
required

What the organization calls the product

string
Example
{
"error": {
"code": "password",
"detail": {
"access": "password"
}
}
}

An error

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
detail
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": "example"
}
}