> ## Documentation Index
> Fetch the complete documentation index at: https://docs.artbucket.io/llms.txt
> Use this file to discover all available pages before exploring further.

# A page of a preview

> What a preview's link shows (POST .../previews): a page of the brand as a proposed change's files say it, as GET .../view gives a page of the draft, every page open, assets signed. A 404 once it has closed.

No key needed.



## OpenAPI

````yaml /openapi.json get /api/v1/previews/{token}
openapi: 3.1.0
info:
  title: artbucket
  version: '1'
  description: >-
    Agent-first asset management. The web UI is built on this API and nothing
    else, beside signing in at /api/auth. Send `Authorization: Bearer <key>`: a
    key works in one workspace with one scope, and scopes are a ladder: read <
    propose < write < admin. People signed in to the app carry a session cookie
    instead, and their scope is what their grants add up to: on the
    organization, the workspace, or single collections and assets. A scope shown
    as needed on the workspace is also enough on the one collection or asset a
    route acts on. Agents (MCP at POST /api/v1/mcp) usually get `propose`: what
    they add waits for a human.
servers:
  - url: http://localhost:3000
security:
  - bearer: []
  - session: []
  - {}
paths:
  /api/v1/previews/{token}:
    parameters:
      - name: token
        in: path
        required: true
        description: The preview's token, from its link
        schema:
          type: string
    get:
      summary: A page of a preview
      description: >-
        What a preview's link shows (POST .../previews): a page of the brand as
        a proposed change's files say it, as GET .../view gives a page of the
        draft, every page open, assets signed. A 404 once it has closed.


        No key needed.
      parameters:
        - name: page
          in: query
          schema:
            type: string
          description: The page's slug; the first page when left out
        - name: context
          in: query
          schema:
            type: string
          description: The context the reader starts in
        - name: lang
          in: query
          schema:
            type: string
          description: The reader's language
      responses:
        '200':
          description: The page
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      preview:
                        type: object
                        properties:
                          brand:
                            type: string
                          name:
                            type: string
                          ref:
                            type: string
                          title:
                            type:
                              - string
                              - 'null'
                          commit:
                            type:
                              - string
                              - 'null'
                          updatedAt:
                            type: string
                            format: date-time
                            pattern: >-
                              ^(?:(?:\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)))$
                          expiresAt:
                            type: string
                            format: date-time
                            pattern: >-
                              ^(?:(?:\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)))$
                        required:
                          - brand
                          - name
                          - ref
                          - title
                          - commit
                          - updatedAt
                          - expiresAt
                        additionalProperties: false
                      view:
                        type: object
                        properties:
                          brand:
                            type: object
                            properties:
                              slug:
                                type: string
                              name:
                                type: string
                            required:
                              - slug
                              - name
                            additionalProperties: false
                          version:
                            anyOf:
                              - type: object
                                properties:
                                  number:
                                    type: integer
                                    minimum: -9007199254740991
                                    maximum: 9007199254740991
                                  publishedAt:
                                    anyOf:
                                      - type: string
                                        format: date-time
                                        pattern: >-
                                          ^(?:(?:\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)))$
                                      - type: 'null'
                                required:
                                  - number
                                  - publishedAt
                                additionalProperties: false
                              - type: 'null'
                            description: 'The version it shows; null: the draft'
                          context:
                            type:
                              - string
                              - 'null'
                          contexts:
                            type: array
                            items:
                              type: string
                            description: Every context some rule is scoped to
                          lang:
                            type:
                              - string
                              - 'null'
                          theme:
                            type: object
                            properties:
                              v1:
                                type: object
                                propertyNames:
                                  type: string
                                additionalProperties: {}
                                description: >-
                                  The accent, lifted for light and dark pages,
                                  and the faces, as before W3
                              surface:
                                anyOf:
                                  - type: string
                                    description: A hex color
                                  - type: 'null'
                                description: >-
                                  The page ground; null: none set or named, so
                                  the page keeps the app's, light or dark
                              panel:
                                type: string
                                description: A hex color
                              dark:
                                type: string
                                description: A hex color
                              ink:
                                type: string
                                description: A hex color
                              muted:
                                type: string
                                description: A hex color
                              onDark:
                                type: string
                                description: A hex color
                              mutedOnDark:
                                type: string
                                description: A hex color
                              accent:
                                type: string
                                description: >-
                                  The fill, as the brand has it: bands and
                                  buttons
                              accentText:
                                type: string
                                description: >-
                                  The accent where it is text (links), at 4.5:1
                                  on the surface
                              onAccent:
                                type: string
                                description: A hex color
                              accentUse:
                                type: string
                                enum:
                                  - fill
                                  - hairline
                              line:
                                type: string
                                description: A hex color
                              faces:
                                type: object
                                properties:
                                  head:
                                    type: object
                                    properties:
                                      family:
                                        type: string
                                      weight:
                                        type: number
                                      file:
                                        description: The font file for its weight
                                        type: string
                                        format: uuid
                                        pattern: >-
                                          ^([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:
                                        description: >-
                                          Every font file of the rule, one
                                          @font-face each
                                        type: array
                                        items:
                                          type: object
                                          properties:
                                            id:
                                              type: string
                                              format: uuid
                                              pattern: >-
                                                ^([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:
                                              type: string
                                            mime:
                                              type: string
                                          required:
                                            - id
                                            - filename
                                            - mime
                                          additionalProperties: false
                                      fallback:
                                        type: string
                                      google:
                                        description: >-
                                          From Google Fonts, with no files: its
                                          CSS is imported
                                        type: boolean
                                        const: true
                                    required:
                                      - family
                                    additionalProperties: false
                                  body:
                                    type: object
                                    properties:
                                      family:
                                        type: string
                                      weight:
                                        type: number
                                      file:
                                        description: The font file for its weight
                                        type: string
                                        format: uuid
                                        pattern: >-
                                          ^([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:
                                        description: >-
                                          Every font file of the rule, one
                                          @font-face each
                                        type: array
                                        items:
                                          type: object
                                          properties:
                                            id:
                                              type: string
                                              format: uuid
                                              pattern: >-
                                                ^([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:
                                              type: string
                                            mime:
                                              type: string
                                          required:
                                            - id
                                            - filename
                                            - mime
                                          additionalProperties: false
                                      fallback:
                                        type: string
                                      google:
                                        description: >-
                                          From Google Fonts, with no files: its
                                          CSS is imported
                                        type: boolean
                                        const: true
                                    required:
                                      - family
                                    additionalProperties: false
                                  label:
                                    type: object
                                    properties:
                                      family:
                                        type: string
                                      weight:
                                        type: number
                                      file:
                                        description: The font file for its weight
                                        type: string
                                        format: uuid
                                        pattern: >-
                                          ^([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:
                                        description: >-
                                          Every font file of the rule, one
                                          @font-face each
                                        type: array
                                        items:
                                          type: object
                                          properties:
                                            id:
                                              type: string
                                              format: uuid
                                              pattern: >-
                                                ^([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:
                                              type: string
                                            mime:
                                              type: string
                                          required:
                                            - id
                                            - filename
                                            - mime
                                          additionalProperties: false
                                      fallback:
                                        type: string
                                      google:
                                        description: >-
                                          From Google Fonts, with no files: its
                                          CSS is imported
                                        type: boolean
                                        const: true
                                      case:
                                        type: string
                                      tracking:
                                        type: number
                                        description: In em
                                    required:
                                      - family
                                      - case
                                      - tracking
                                    additionalProperties: false
                                additionalProperties: false
                              radius:
                                type: number
                              width:
                                type: string
                                enum:
                                  - narrow
                                  - normal
                                  - wide
                              density:
                                type: string
                                enum:
                                  - compact
                                  - normal
                                  - airy
                              scale:
                                type: number
                              device:
                                anyOf:
                                  - type: string
                                    format: uuid
                                    pattern: >-
                                      ^([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)$
                                  - type: 'null'
                              logo:
                                anyOf:
                                  - type: object
                                    properties:
                                      key:
                                        type: string
                                    required:
                                      - key
                                    additionalProperties: false
                                  - type: 'null'
                              nav:
                                type: string
                                enum:
                                  - sidebar
                                  - top
                                  - overlay
                              band:
                                type: boolean
                                description: header is band
                              header:
                                type: string
                                enum:
                                  - plain
                                  - band
                                  - split
                              separation:
                                type: string
                                enum:
                                  - space
                                  - hairline
                              numbering:
                                type: boolean
                              motion:
                                type: string
                                enum:
                                  - none
                                  - subtle
                              toc:
                                type: string
                                enum:
                                  - side
                                  - inline
                                  - none
                                description: >-
                                  On this page: a side column, a list under the
                                  page header, or none
                              checks:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    pair:
                                      type: string
                                      description: >-
                                        Which color on which, e.g. ink on
                                        surface
                                    fg:
                                      type: string
                                    bg:
                                      type: string
                                    ratio:
                                      type: number
                                    need:
                                      type: number
                                      description: >-
                                        The contrast it must reach: 4.5 for
                                        text, 3 for marks
                                    ok:
                                      type: boolean
                                    used:
                                      type: string
                                      description: >-
                                        The color used: fg when it passes, else
                                        its fallback
                                  required:
                                    - pair
                                    - fg
                                    - bg
                                    - ratio
                                    - need
                                    - ok
                                    - used
                                  additionalProperties: false
                                description: >-
                                  Contrast of each pair in the look: one that
                                  fails falls back to a color that reads, and
                                  says which
                              settings:
                                type: object
                                properties:
                                  accent:
                                    description: >-
                                      Color rule for links, marks and brand
                                      grounds; color.primary, brand or accent
                                      when left out
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  accentUse:
                                    description: >-
                                      hairline: the accent draws rules and
                                      marks, never fills
                                    type: string
                                    enum:
                                      - fill
                                      - hairline
                                  surface:
                                    description: >-
                                      The page ground; color.background, surface
                                      or paper when left out, else the app's
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  panel:
                                    description: >-
                                      Panels and alternate sections; a step off
                                      the surface when left out
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  dark:
                                    description: The dark ground
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  ink:
                                    description: >-
                                      Text; color.ink, text or foreground when
                                      left out, else black or white by contrast
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  muted:
                                    description: >-
                                      Quiet text; mixed from ink and surface
                                      when left out
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  head:
                                    description: Font rule for headings
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  body:
                                    description: Font rule for text
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  label:
                                    description: >-
                                      Font rule for eyebrows, labels and running
                                      heads; its spec.case and spec.tracking set
                                      them
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  logo:
                                    description: >-
                                      The rule whose picture is the site's mark;
                                      logo.primary, mark or wordmark when left
                                      out
                                    anyOf:
                                      - type: string
                                        maxLength: 120
                                        pattern: >-
                                          ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                      - type: 'null'
                                  device:
                                    description: >-
                                      An SVG asset: the brand's symbol or
                                      pattern for covers, dividers and pattern
                                      grounds
                                    anyOf:
                                      - type: string
                                        format: uuid
                                        pattern: >-
                                          ^([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)$
                                      - type: 'null'
                                  radius:
                                    description: Corner radius in px
                                    type: integer
                                    minimum: 0
                                    maximum: 40
                                  width:
                                    type: string
                                    enum:
                                      - narrow
                                      - normal
                                      - wide
                                  density:
                                    type: string
                                    enum:
                                      - compact
                                      - normal
                                      - airy
                                  scale:
                                    description: Heading size ratio; 1.25 when left out
                                    type: number
                                    minimum: 1.067
                                    maximum: 1.618
                                  nav:
                                    type: string
                                    enum:
                                      - sidebar
                                      - top
                                      - overlay
                                  band:
                                    description: >-
                                      Every page opens on a band of the brand
                                      color; header band says the same
                                    type: boolean
                                  header:
                                    description: >-
                                      A page's opening: on the page, on a band
                                      of the brand color, or beside its cover
                                    type: string
                                    enum:
                                      - plain
                                      - band
                                      - split
                                  separation:
                                    description: >-
                                      Between two sections on the page's own
                                      ground: space alone, or a hairline too
                                    type: string
                                    enum:
                                      - space
                                      - hairline
                                  numbering:
                                    description: 'Number chapters and pages: 01, 01.2'
                                    type: boolean
                                  motion:
                                    description: >-
                                      subtle: sections reveal as they scroll in;
                                      never with reduced motion
                                    type: string
                                    enum:
                                      - none
                                      - subtle
                                  toc:
                                    description: >-
                                      On this page: a side column, a list under
                                      the page header, or hidden
                                    type: string
                                    enum:
                                      - side
                                      - inline
                                      - none
                                  titles:
                                    description: >-
                                      Section titles: headings (medium), or
                                      headlines (large, huge); a section's own
                                      size wins
                                    type: string
                                    enum:
                                      - medium
                                      - large
                                      - huge
                                  grounds:
                                    description: >-
                                      alternate: every other section on the
                                      page's own ground sits on the panel, so a
                                      long page has rhythm
                                    type: string
                                    enum:
                                      - plain
                                      - alternate
                                  languages:
                                    description: >-
                                      The languages readers pick from; the first
                                      is the one the pages are written in
                                    maxItems: 12
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        code:
                                          type: string
                                          maxLength: 20
                                          pattern: ^[a-z]{2,3}(-[a-z0-9]{2,8})?$
                                        label:
                                          type: string
                                          minLength: 1
                                          maxLength: 40
                                        dir:
                                          description: From the language when left out
                                          type: string
                                          enum:
                                            - ltr
                                            - rtl
                                      required:
                                        - code
                                        - label
                                      additionalProperties: false
                                additionalProperties: false
                            required:
                              - v1
                              - surface
                              - panel
                              - dark
                              - ink
                              - muted
                              - onDark
                              - mutedOnDark
                              - accent
                              - accentText
                              - onAccent
                              - accentUse
                              - line
                              - faces
                              - radius
                              - width
                              - density
                              - scale
                              - device
                              - logo
                              - nav
                              - band
                              - header
                              - separation
                              - numbering
                              - motion
                              - toc
                              - checks
                              - settings
                            additionalProperties: false
                            description: >-
                              The look, derived and graded, and the settings it
                              came from
                          nav:
                            type: array
                            items:
                              type: object
                              properties:
                                slug:
                                  type: string
                                title:
                                  type: string
                                parent:
                                  description: The page it sits under; null at the top
                                  type:
                                    - string
                                    - 'null'
                                position:
                                  type: integer
                                  minimum: -9007199254740991
                                  maximum: 9007199254740991
                                eyebrow:
                                  type:
                                    - string
                                    - 'null'
                                lede:
                                  type:
                                    - string
                                    - 'null'
                                cover:
                                  anyOf:
                                    - type: string
                                      format: uuid
                                      pattern: >-
                                        ^([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)$
                                    - type: 'null'
                                  description: Its header and card image
                                icon:
                                  type:
                                    - string
                                    - 'null'
                                audience:
                                  type: string
                                  enum:
                                    - everyone
                                    - partners
                                    - members
                                  description: 'On portals: who may read it'
                                tabs:
                                  type: boolean
                                  description: Its child pages show as tabs across its top
                                home:
                                  type: boolean
                                  description: >-
                                    The first page, opening on a cover: never
                                    numbered
                                locked:
                                  type: boolean
                                  description: >-
                                    Above the reader: listed by title with a
                                    lock, nothing more
                                updatedAt:
                                  anyOf:
                                    - type: string
                                      format: date-time
                                      pattern: >-
                                        ^(?:(?:\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)))$
                                    - type: 'null'
                              required:
                                - slug
                                - title
                                - parent
                                - position
                                - eyebrow
                                - lede
                                - cover
                                - icon
                                - audience
                                - tabs
                                - home
                                - locked
                                - updatedAt
                              additionalProperties: false
                            description: Every page the reader is listed, in order
                          page:
                            anyOf:
                              - type: object
                                properties:
                                  slug:
                                    type: string
                                  title:
                                    type: string
                                  parent:
                                    description: The page it sits under; null at the top
                                    type:
                                      - string
                                      - 'null'
                                  position:
                                    type: integer
                                    minimum: -9007199254740991
                                    maximum: 9007199254740991
                                  eyebrow:
                                    type:
                                      - string
                                      - 'null'
                                  lede:
                                    type:
                                      - string
                                      - 'null'
                                  cover:
                                    anyOf:
                                      - type: string
                                        format: uuid
                                        pattern: >-
                                          ^([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)$
                                      - type: 'null'
                                    description: Its header and card image
                                  icon:
                                    type:
                                      - string
                                      - 'null'
                                  audience:
                                    type: string
                                    enum:
                                      - everyone
                                      - partners
                                      - members
                                    description: 'On portals: who may read it'
                                  tabs:
                                    type: boolean
                                    description: >-
                                      Its child pages show as tabs across its
                                      top
                                  home:
                                    type: boolean
                                    description: >-
                                      The first page, opening on a cover: never
                                      numbered
                                  updatedAt:
                                    anyOf:
                                      - type: string
                                        format: date-time
                                        pattern: >-
                                          ^(?:(?:\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)))$
                                      - type: 'null'
                                  sections:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        id:
                                          type: string
                                        template:
                                          type: string
                                          description: GET /api/v1/brand/templates lists them
                                        title:
                                          type: string
                                        body:
                                          type: string
                                          description: Markdown
                                        width:
                                          type: string
                                          enum:
                                            - text
                                            - wide
                                            - full
                                        columns:
                                          type: integer
                                          minimum: -9007199254740991
                                          maximum: 9007199254740991
                                        tone:
                                          type: string
                                          description: >-
                                            Its ground: plain, tint, brand, panel,
                                            dark, color, image or pattern
                                        hidden:
                                          type: boolean
                                        keys:
                                          type: array
                                          items:
                                            type: string
                                          description: The rules it shows, by key, in order
                                        props:
                                          type: object
                                          propertyNames:
                                            type: string
                                          additionalProperties: {}
                                          description: Its template's own settings
                                        eyebrow:
                                          type: string
                                        lede:
                                          type: string
                                        aside:
                                          type: string
                                          description: Markdown
                                        tab:
                                          description: >-
                                            Sections sharing a tab name show under
                                            one tab
                                          type: string
                                        background:
                                          type: object
                                          properties:
                                            color:
                                              type: string
                                            to:
                                              type: string
                                            angle:
                                              type: number
                                            image:
                                              type: string
                                              format: uuid
                                              pattern: >-
                                                ^([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:
                                              type: number
                                          additionalProperties: false
                                        items:
                                          type: array
                                          items:
                                            type: object
                                            properties:
                                              key:
                                                type: string
                                                description: A rule it shows
                                              asset:
                                                type: string
                                                format: uuid
                                                pattern: >-
                                                  ^([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:
                                                type: string
                                              text:
                                                type: string
                                                description: Markdown
                                              verdict:
                                                type: string
                                                enum:
                                                  - do
                                                  - dont
                                              caption:
                                                type: string
                                              link:
                                                type: string
                                              label:
                                                type: string
                                              icon:
                                                type: string
                                              download:
                                                type: boolean
                                                description: >-
                                                  false: for reference, never offered as a
                                                  download
                                            additionalProperties: false
                                            description: >-
                                              A thing a template lists: a do or a
                                              don't with its picture, a picture in a
                                              gallery
                                        audience:
                                          type: string
                                          enum:
                                            - everyone
                                            - partners
                                            - members
                                        contexts:
                                          description: >-
                                            A tab per context, its rules resolved
                                            for each
                                          type: array
                                          items:
                                            type: string
                                        only:
                                          description: Shown only in this context
                                          type: string
                                        translations:
                                          description: >-
                                            Its words by language tag; readers get
                                            them already in their language
                                          type: object
                                          propertyNames:
                                            type: string
                                          additionalProperties:
                                            type: object
                                            properties:
                                              title:
                                                type: string
                                                maxLength: 300
                                              eyebrow:
                                                type: string
                                                maxLength: 120
                                              lede:
                                                type: string
                                                maxLength: 1000
                                              body:
                                                type: string
                                                maxLength: 20000
                                              aside:
                                                type: string
                                                maxLength: 4000
                                              items:
                                                maxItems: 60
                                                type: array
                                                items:
                                                  anyOf:
                                                    - type: object
                                                      properties:
                                                        title:
                                                          type: string
                                                          maxLength: 200
                                                        text:
                                                          type: string
                                                          maxLength: 4000
                                                        caption:
                                                          type: string
                                                          maxLength: 500
                                                      additionalProperties: false
                                                    - type: 'null'
                                            additionalProperties: false
                                      required:
                                        - id
                                        - template
                                        - title
                                        - body
                                        - width
                                        - columns
                                        - tone
                                        - hidden
                                        - keys
                                        - props
                                      additionalProperties: false
                                    description: >-
                                      What the reader gets: hidden ones for
                                      editors only
                                  aliases:
                                    type: array
                                    items:
                                      type: string
                                  layout:
                                    type: string
                                    enum:
                                      - book
                                      - landing
                                    description: >-
                                      landing: a front with no nav column,
                                      on-this-page or pager; book: a chapter
                                required:
                                  - slug
                                  - title
                                  - parent
                                  - position
                                  - eyebrow
                                  - lede
                                  - cover
                                  - icon
                                  - audience
                                  - tabs
                                  - home
                                  - updatedAt
                                  - sections
                                  - aliases
                                  - layout
                                additionalProperties: false
                              - type: 'null'
                            description: 'null: locked for this reader'
                          locked:
                            type: boolean
                          redirect:
                            description: 'An old slug was asked for: the page''s slug now'
                            type: string
                          rules:
                            type: array
                            items:
                              type: object
                              properties:
                                key:
                                  type: string
                                  description: Dotted, e.g. color.primary
                                label:
                                  description: >-
                                    The heading readers see; null: the key, in
                                    words
                                  type:
                                    - string
                                    - 'null'
                                context:
                                  description: 'null: the default'
                                  type:
                                    - string
                                    - 'null'
                                type:
                                  type: string
                                  enum:
                                    - color
                                    - text
                                    - number
                                    - list
                                    - font
                                value:
                                  anyOf:
                                    - type: string
                                    - type: number
                                    - type: array
                                      items:
                                        type:
                                          - string
                                          - number
                                    - type: object
                                      properties:
                                        family:
                                          type: string
                                          minLength: 1
                                          maxLength: 120
                                        size:
                                          description: Pixels
                                          type: number
                                          exclusiveMinimum: 0
                                          maximum: 1000
                                        weight:
                                          description: 400 regular, 700 bold
                                          type: integer
                                          minimum: 1
                                          maximum: 1000
                                      required:
                                        - family
                                      additionalProperties: false
                                spec:
                                  anyOf:
                                    - type: object
                                      propertyNames:
                                        type: string
                                      additionalProperties: {}
                                    - type: 'null'
                                  description: >-
                                    Details beyond the value, by type:
                                    RuleInput's spec
                                usage:
                                  type:
                                    - string
                                    - 'null'
                                assets:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      id:
                                        type: string
                                        format: uuid
                                        pattern: >-
                                          ^([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:
                                        type:
                                          - string
                                          - 'null'
                                      title:
                                        type:
                                          - string
                                          - 'null'
                                      filename:
                                        type: string
                                      mime:
                                        type: string
                                      width:
                                        anyOf:
                                          - type: integer
                                            minimum: -9007199254740991
                                            maximum: 9007199254740991
                                          - type: 'null'
                                      height:
                                        anyOf:
                                          - type: integer
                                            minimum: -9007199254740991
                                            maximum: 9007199254740991
                                          - type: 'null'
                                      size:
                                        type: integer
                                        minimum: -9007199254740991
                                        maximum: 9007199254740991
                                      preview:
                                        type: boolean
                                        description: >-
                                          Has renditions: /a/{id}/{rendition}
                                          draws it
                                    required:
                                      - id
                                      - rendition
                                      - title
                                      - filename
                                      - mime
                                      - width
                                      - height
                                      - size
                                      - preview
                                    additionalProperties: false
                                  description: >-
                                    Its assets readers may see, in order; one
                                    that may not be used is left out
                              required:
                                - key
                                - label
                                - context
                                - type
                                - value
                                - spec
                                - usage
                                - assets
                              additionalProperties: false
                            description: >-
                              Every context version of the rules the page binds,
                              the theme's, and those their specs name
                          media:
                            type: object
                            propertyNames:
                              type: string
                              format: uuid
                              pattern: >-
                                ^([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)$
                            additionalProperties:
                              type: object
                              properties:
                                id:
                                  type: string
                                  format: uuid
                                  pattern: >-
                                    ^([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:
                                  type: string
                                title:
                                  type:
                                    - string
                                    - 'null'
                                description:
                                  type:
                                    - string
                                    - 'null'
                                creator:
                                  type:
                                    - string
                                    - 'null'
                                copyright:
                                  type:
                                    - string
                                    - 'null'
                                mime:
                                  type: string
                                size:
                                  type: integer
                                  minimum: -9007199254740991
                                  maximum: 9007199254740991
                                width:
                                  anyOf:
                                    - type: integer
                                      minimum: -9007199254740991
                                      maximum: 9007199254740991
                                    - type: 'null'
                                height:
                                  anyOf:
                                    - type: integer
                                      minimum: -9007199254740991
                                      maximum: 9007199254740991
                                    - type: 'null'
                                thumbnail:
                                  description: A URL on this host
                                  type:
                                    - string
                                    - 'null'
                                preview:
                                  description: Larger, for a closer look
                                  type:
                                    - string
                                    - 'null'
                                downloads:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      preset:
                                        type: string
                                        enum:
                                          - web
                                          - social
                                          - story
                                          - print
                                          - png
                                          - original
                                      label:
                                        type: string
                                      hint:
                                        type: string
                                      url:
                                        type: string
                                      filename:
                                        type: string
                                    required:
                                      - preset
                                      - label
                                      - hint
                                      - url
                                      - filename
                                    additionalProperties: false
                                original:
                                  type: string
                                  description: The file as uploaded
                                focus:
                                  anyOf:
                                    - type: object
                                      properties:
                                        x:
                                          type: number
                                        'y':
                                          type: number
                                      required:
                                        - x
                                        - 'y'
                                      additionalProperties: false
                                    - type: 'null'
                                  description: >-
                                    Where a crop keeps its subject, from 0 to 1
                                    across and down
                                updatedAt:
                                  type: string
                                  format: date-time
                                  pattern: >-
                                    ^(?:(?:\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)))$
                              required:
                                - id
                                - filename
                                - title
                                - description
                                - creator
                                - copyright
                                - mime
                                - size
                                - width
                                - height
                                - thumbnail
                                - preview
                                - downloads
                                - original
                                - focus
                                - updatedAt
                              additionalProperties: false
                            description: The assets it names that may be used, by id
                          collections:
                            type: object
                            propertyNames:
                              type: string
                            additionalProperties:
                              type: object
                              properties:
                                items:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      id:
                                        type: string
                                        format: uuid
                                        pattern: >-
                                          ^([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:
                                        type: string
                                      title:
                                        type:
                                          - string
                                          - 'null'
                                      description:
                                        type:
                                          - string
                                          - 'null'
                                      creator:
                                        type:
                                          - string
                                          - 'null'
                                      copyright:
                                        type:
                                          - string
                                          - 'null'
                                      mime:
                                        type: string
                                      size:
                                        type: integer
                                        minimum: -9007199254740991
                                        maximum: 9007199254740991
                                      width:
                                        anyOf:
                                          - type: integer
                                            minimum: -9007199254740991
                                            maximum: 9007199254740991
                                          - type: 'null'
                                      height:
                                        anyOf:
                                          - type: integer
                                            minimum: -9007199254740991
                                            maximum: 9007199254740991
                                          - type: 'null'
                                      thumbnail:
                                        description: A URL on this host
                                        type:
                                          - string
                                          - 'null'
                                      preview:
                                        description: Larger, for a closer look
                                        type:
                                          - string
                                          - 'null'
                                      downloads:
                                        type: array
                                        items:
                                          type: object
                                          properties:
                                            preset:
                                              type: string
                                              enum:
                                                - web
                                                - social
                                                - story
                                                - print
                                                - png
                                                - original
                                            label:
                                              type: string
                                            hint:
                                              type: string
                                            url:
                                              type: string
                                            filename:
                                              type: string
                                          required:
                                            - preset
                                            - label
                                            - hint
                                            - url
                                            - filename
                                          additionalProperties: false
                                      original:
                                        type: string
                                        description: The file as uploaded
                                      focus:
                                        anyOf:
                                          - type: object
                                            properties:
                                              x:
                                                type: number
                                              'y':
                                                type: number
                                            required:
                                              - x
                                              - 'y'
                                            additionalProperties: false
                                          - type: 'null'
                                        description: >-
                                          Where a crop keeps its subject, from 0
                                          to 1 across and down
                                      updatedAt:
                                        type: string
                                        format: date-time
                                        pattern: >-
                                          ^(?:(?:\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)))$
                                    required:
                                      - id
                                      - filename
                                      - title
                                      - description
                                      - creator
                                      - copyright
                                      - mime
                                      - size
                                      - width
                                      - height
                                      - thumbnail
                                      - preview
                                      - downloads
                                      - original
                                      - focus
                                      - updatedAt
                                    additionalProperties: false
                                total:
                                  type: integer
                                  minimum: -9007199254740991
                                  maximum: 9007199254740991
                                error:
                                  description: Why it shows nothing; editors only
                                  type:
                                    - string
                                    - 'null'
                              required:
                                - items
                                - total
                                - error
                              additionalProperties: false
                            description: A collection section's assets, by section id
                          updates:
                            description: >-
                              With an updates section: the latest publishes,
                              newest first, as many as its largest limit
                            type: array
                            items:
                              type: object
                              properties:
                                version:
                                  type: integer
                                  minimum: -9007199254740991
                                  maximum: 9007199254740991
                                publishedAt:
                                  type: string
                                  format: date-time
                                  pattern: >-
                                    ^(?:(?:\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:
                                  type:
                                    - string
                                    - 'null'
                                note:
                                  description: What changed, in the publisher's words
                                  type:
                                    - string
                                    - 'null'
                                image:
                                  anyOf:
                                    - type: string
                                      format: uuid
                                      pattern: >-
                                        ^([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)$
                                    - type: 'null'
                                  description: >-
                                    An asset shown beside the note; null when it
                                    may no longer be used
                                changes:
                                  type: object
                                  properties:
                                    rules:
                                      type: object
                                      properties:
                                        added:
                                          type: array
                                          items:
                                            type: string
                                        changed:
                                          type: array
                                          items:
                                            type: string
                                        removed:
                                          type: array
                                          items:
                                            type: string
                                      required:
                                        - added
                                        - changed
                                        - removed
                                      additionalProperties: false
                                      description: By key
                                    pages:
                                      type: object
                                      properties:
                                        added:
                                          type: array
                                          items:
                                            type: object
                                            properties:
                                              slug:
                                                type: string
                                              title:
                                                type: string
                                            required:
                                              - slug
                                              - title
                                            additionalProperties: false
                                        changed:
                                          type: array
                                          items:
                                            type: object
                                            properties:
                                              slug:
                                                type: string
                                              title:
                                                type: string
                                            required:
                                              - slug
                                              - title
                                            additionalProperties: false
                                        removed:
                                          type: array
                                          items:
                                            type: object
                                            properties:
                                              slug:
                                                type: string
                                              title:
                                                type: string
                                            required:
                                              - slug
                                              - title
                                            additionalProperties: false
                                      required:
                                        - added
                                        - changed
                                        - removed
                                      additionalProperties: false
                                      description: >-
                                        Pages readers can reach: a hidden one is
                                        left out
                                  required:
                                    - rules
                                    - pages
                                  additionalProperties: false
                                  description: >-
                                    What it changed for readers since the
                                    publish before it
                              required:
                                - version
                                - publishedAt
                                - publishedBy
                                - note
                                - image
                                - changes
                              additionalProperties: false
                          signed:
                            type: object
                            propertyNames:
                              type: string
                              format: uuid
                              pattern: >-
                                ^([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)$
                            additionalProperties:
                              type: string
                            description: >-
                              Signatures by asset id, for visitors; empty for
                              members
                          warnings:
                            type: array
                            items:
                              type: string
                            description: >-
                              Editors only: what a reader would trip on, assets
                              they won't see, and theme pairs that fell back
                          missing:
                            type: array
                            items:
                              type: string
                            description: 'Editors only: keys a section binds with no rule'
                        required:
                          - brand
                          - version
                          - context
                          - contexts
                          - lang
                          - theme
                          - nav
                          - page
                          - locked
                          - rules
                          - media
                          - collections
                          - signed
                          - warnings
                          - missing
                        additionalProperties: false
                    required:
                      - preview
                      - view
                    additionalProperties: false
                required:
                  - data
                additionalProperties: false
        default:
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                      detail: {}
                    required:
                      - code
                      - message
                    additionalProperties: false
                required:
                  - error
                additionalProperties: false
      security: []
components:
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: 'An API key: ab_...'
    session:
      type: apiKey
      in: cookie
      name: better-auth.session_token
      description: Signed in, at /api/auth

````