> ## 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.

# Edit a page an operation at a time

> `ops` apply in order: `add`, `update`, `move` and `remove` sections, and `page` for its own fields. `page` with `slug` renames it: the old slug becomes an alias that still finds it, and the pages under it follow. All or none: a 422 lists every problem with its path, e.g. `ops[0].section.props.chanel: Unrecognized key`.

Scope: `write`.



## OpenAPI

````yaml /openapi.json patch /api/v1/brands/{slug}/pages/{page}
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/brands/{slug}/pages/{page}:
    parameters:
      - name: slug
        in: path
        required: true
        description: Brand slug
        schema:
          type: string
      - name: page
        in: path
        required: true
        description: The page's slug, e.g. logo
        schema:
          type: string
    patch:
      summary: Edit a page an operation at a time
      description: >-
        `ops` apply in order: `add`, `update`, `move` and `remove` sections, and
        `page` for its own fields. `page` with `slug` renames it: the old slug
        becomes an alias that still finds it, and the pages under it follow. All
        or none: a 422 lists every problem with its path, e.g.
        `ops[0].section.props.chanel: Unrecognized key`.


        Scope: `write`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                ops:
                  minItems: 1
                  maxItems: 50
                  type: array
                  items:
                    oneOf:
                      - type: object
                        properties:
                          op:
                            type: string
                            const: add
                          section:
                            type: object
                            properties:
                              id:
                                description: Kept across edits; made up when left out
                                type: string
                                pattern: ^[a-z0-9_-]{1,40}$
                              title:
                                type: string
                                maxLength: 300
                              body:
                                description: Markdown (GFM), shown under the title
                                type: string
                                maxLength: 20000
                              width:
                                description: >-
                                  text (a reading column), wide, or full bleed;
                                  the template's default when left out
                                type: string
                                enum:
                                  - text
                                  - wide
                                  - full
                              columns:
                                type: integer
                                minimum: 1
                                maximum: 4
                              tone:
                                description: >-
                                  The ground. panel: the second surface; color
                                  and image: set in background; pattern: the
                                  theme's device
                                type: string
                                enum:
                                  - plain
                                  - tint
                                  - brand
                                  - panel
                                  - dark
                                  - color
                                  - image
                                  - pattern
                              hidden:
                                description: Kept, but not shown to readers
                                type: boolean
                              keys:
                                description: The rules it shows, by key, in order
                                maxItems: 100
                                type: array
                                items:
                                  type: string
                                  maxLength: 120
                                  pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                              eyebrow:
                                description: >-
                                  A small line above the title: a number, a
                                  chapter
                                type: string
                                maxLength: 120
                              lede:
                                description: >-
                                  A line or two under the title, set large;
                                  plain text
                                type: string
                                maxLength: 1000
                              aside:
                                description: Markdown in a ruled column beside the body
                                type: string
                                maxLength: 4000
                              tab:
                                description: Sections sharing a tab name show under one tab
                                type: string
                                minLength: 1
                                maxLength: 40
                              space:
                                description: Room above it
                                type: string
                                enum:
                                  - tight
                                  - loose
                              background:
                                description: For tone color and tone image
                                type: object
                                properties:
                                  color:
                                    description: 'tone color: the color rule it is set on'
                                    type: string
                                    maxLength: 120
                                    pattern: ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                  image:
                                    description: 'tone image: the picture'
                                    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:
                                    description: >-
                                      tone image: how much to darken it; 0.45
                                      when left out
                                    type: number
                                    minimum: 0
                                    maximum: 0.9
                                additionalProperties: false
                              items:
                                description: >-
                                  What the template lists; list_templates says
                                  which take items
                                maxItems: 60
                                type: array
                                items:
                                  type: object
                                  properties:
                                    key:
                                      description: A rule it shows, by key
                                      type: string
                                      maxLength: 120
                                      pattern: >-
                                        ^[a-z][a-zA-Z0-9]*(\.[a-z][a-zA-Z0-9]*)*$
                                    asset:
                                      description: >-
                                        An image, video or file, from
                                        search_assets
                                      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
                                      maxLength: 200
                                    text:
                                      description: Markdown
                                      type: string
                                      maxLength: 4000
                                    verdict:
                                      description: A do (green) or a don't (red)
                                      type: string
                                      enum:
                                        - do
                                        - dont
                                    caption:
                                      description: >-
                                        Under the media; the asset's description
                                        when left out
                                      type: string
                                      maxLength: 500
                                    link:
                                      type: string
                                      minLength: 1
                                      maxLength: 2000
                                    label:
                                      description: 'A small tag: Figma, PDF, Partners only'
                                      type: string
                                      maxLength: 40
                                    icon:
                                      description: One of the icons a page takes
                                      type: string
                                    download:
                                      type: boolean
                                      description: >-
                                        false: for reference, never offered as a
                                        download
                                    span:
                                      description: 'gallery bento: 2 takes two cells'
                                      type: integer
                                      minimum: 1
                                      maximum: 2
                                    at:
                                      description: 'annotated: [x, y], % from the top left'
                                      type: array
                                      prefixItems:
                                        - type: number
                                          minimum: 0
                                          maximum: 100
                                        - type: number
                                          minimum: 0
                                          maximum: 100
                                      items: false
                                      minItems: 2
                                      maxItems: 2
                                    level:
                                      description: 'cards tree: 0 at the top'
                                      type: integer
                                      minimum: 0
                                      maximum: 2
                                  additionalProperties: false
                              audience:
                                description: >-
                                  On portals: everyone let in, partners (by a
                                  password or an approved request) or members
                                type: string
                                enum:
                                  - everyone
                                  - partners
                                  - members
                              contexts:
                                description: >-
                                  A tab per context, rules resolved for each:
                                  ["default", "dark-background"]; default: no
                                  context
                                minItems: 2
                                maxItems: 8
                                type: array
                                items:
                                  type: string
                                  maxLength: 64
                                  pattern: ^[a-z0-9]+(-[a-z0-9]+)*$
                              only:
                                description: Shown only in this context
                                type: string
                                maxLength: 64
                                pattern: ^[a-z0-9]+(-[a-z0-9]+)*$
                              translations:
                                description: >-
                                  Its words by language tag; what is left out
                                  falls back
                                type: object
                                propertyNames:
                                  type: string
                                  maxLength: 20
                                  pattern: ^[a-z]{2,3}(-[a-z0-9]{2,8})?$
                                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
                              template:
                                type: string
                                enum:
                                  - cover
                                  - header
                                  - text
                                  - split
                                  - cards
                                  - palette
                                  - type
                                  - logos
                                  - dodont
                                  - gallery
                                  - collection
                                  - links
                                  - pages
                                  - diagram
                                  - updates
                                  - annotated
                                  - specs
                                  - specimen
                                  - pattern
                                  - chart
                                  - copy
                                  - faq
                                  - embed
                                  - request
                              props:
                                type: object
                                properties:
                                  image:
                                    description: >-
                                      cover: A background image instead of the
                                      brand color; header: A picture in the
                                      band; split: Shown beside the words; else
                                      the first bound rule's picture; annotated
                                    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)$
                                  video:
                                    description: >-
                                      cover: A muted loop over the image, its
                                      poster
                                    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)$
                                  align:
                                    description: >-
                                      cover: start, center, end; split: start,
                                      center
                                    type: string
                                    enum:
                                      - start
                                      - center
                                      - end
                                  height:
                                    description: cover
                                    type: string
                                    enum:
                                      - auto
                                      - tall
                                      - screen
                                  strip:
                                    description: >-
                                      cover: The palette as a strip; true when
                                      left out
                                    type: boolean
                                  mark:
                                    description: 'cover: Logo above the title'
                                    type: string
                                    enum:
                                      - home
                                      - always
                                      - never
                                  flip:
                                    description: 'split: Image on the left'
                                    type: boolean
                                  ratio:
                                    description: 'split: The wider side'
                                    type: string
                                    enum:
                                      - even
                                      - words
                                      - picture
                                  fit:
                                    description: split
                                    type: string
                                    enum:
                                      - auto
                                      - fill
                                      - whole
                                  layout:
                                    description: >-
                                      cards: cards, list, stats, checklist,
                                      tree; dodont: pairs, grid, rows; gallery:
                                      grid, bento, carousel, collage, crops;
                                      collection: grid, masonry, list; links:
                                      cards, list; pages: cards, list; faq:
                                      accordion, definitions
                                    type: string
                                    enum:
                                      - cards
                                      - list
                                      - stats
                                      - checklist
                                      - tree
                                      - pairs
                                      - grid
                                      - rows
                                      - bento
                                      - carousel
                                      - collage
                                      - crops
                                      - masonry
                                      - accordion
                                      - definitions
                                  show:
                                    description: >-
                                      palette: Values listed; all it has when
                                      left out
                                    maxItems: 8
                                    type: array
                                    items:
                                      type: string
                                      enum:
                                        - hex
                                        - rgb
                                        - hsl
                                        - cmyk
                                        - pantone
                                        - ral
                                        - token
                                        - css
                                  media:
                                    description: >-
                                      palette: Values it opens on; screen when
                                      left out
                                    type: string
                                    enum:
                                      - screen
                                      - print
                                  matrix:
                                    description: 'palette: Contrast of every pair'
                                    type: boolean
                                  ase:
                                    description: 'palette: An .ase swatch download'
                                    type: boolean
                                  simulate:
                                    description: 'palette: Color blindness views'
                                    type: boolean
                                  sample:
                                    description: 'type: The specimen''s starting text'
                                    type: string
                                    maxLength: 200
                                  roles:
                                    description: 'type: A table of roles'
                                    type: boolean
                                  glyphs:
                                    description: 'type: Character sets'
                                    type: boolean
                                  embed:
                                    description: 'type: Code to load the faces'
                                    type: boolean
                                  formula:
                                    description: 'type: base in px'
                                    type: object
                                    properties:
                                      base:
                                        type: number
                                        minimum: 4
                                        maximum: 200
                                      ratio:
                                        type: number
                                        minimum: 1
                                        maximum: 4
                                      steps:
                                        type: integer
                                        minimum: 1
                                        maximum: 12
                                    required:
                                      - base
                                      - ratio
                                      - steps
                                    additionalProperties: false
                                  kit:
                                    description: >-
                                      logos: A zip of every mark; true when left
                                      out
                                    type: boolean
                                  ask:
                                    description: 'logos: Which mark for which context'
                                    type: boolean
                                  size:
                                    description: 'logos: How much of its tile a mark fills'
                                    type: string
                                    enum:
                                      - medium
                                      - small
                                      - large
                                  backdrop:
                                    description: logos
                                    type: string
                                    enum:
                                      - checker
                                      - light
                                      - dark
                                  collection:
                                    description: 'collection: A collection''s 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)$
                                  search:
                                    description: 'collection: A saved search''s 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)$
                                  query:
                                    description: >-
                                      collection: Filters, as the library's
                                      query string:
                                      q=poster&type=image&tag=campaign&f.channel=web.
                                      Narrows the collection or saved search
                                    type: string
                                    maxLength: 2000
                                  sort:
                                    description: collection
                                    type: string
                                    enum:
                                      - newest
                                      - oldest
                                      - name
                                  limit:
                                    description: >-
                                      collection: At most this many; 24 when
                                      left out; updates: How many publishes; 5
                                      when left out, 20 at most
                                    type: integer
                                    minimum: 1
                                    maximum: 200
                                  downloads:
                                    description: >-
                                      collection: Offer downloads; true when
                                      left out
                                    type: boolean
                                  from:
                                    description: >-
                                      pages: The page whose children it shows;
                                      this page when left out
                                    type: string
                                    maxLength: 60
                                    pattern: ^[a-z0-9]+(-[a-z0-9]+)*$
                                  depth:
                                    description: >-
                                      pages: How many levels a list goes down: a
                                      table of contents
                                    type: integer
                                    minimum: 1
                                    maximum: 3
                                  kind:
                                    description: >-
                                      diagram: clearspace when left out;
                                      specimen: spacing, radius, shadow, motion,
                                      grid; chart: bar, line, donut; request:
                                      asset, review, question
                                    type: string
                                    enum:
                                      - clearspace
                                      - minsize
                                      - placement
                                      - cobrand
                                      - spacing
                                      - radius
                                      - shadow
                                      - motion
                                      - grid
                                      - bar
                                      - line
                                      - donut
                                      - asset
                                      - review
                                      - question
                                  positions:
                                    description: 'diagram: placement: where it may sit'
                                    maxItems: 9
                                    type: array
                                    items:
                                      type: string
                                      enum:
                                        - tl
                                        - tc
                                        - tr
                                        - ml
                                        - mc
                                        - mr
                                        - bl
                                        - bc
                                        - br
                                  partner:
                                    description: 'diagram: cobrand: their name'
                                    type: string
                                    maxLength: 60
                                  separator:
                                    description: 'diagram: cobrand: line when left out'
                                    type: string
                                    enum:
                                      - line
                                      - x
                                      - none
                                  asset:
                                    description: 'pattern: The tile'
                                    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)$
                                  scales:
                                    description: 'pattern: Tile sizes, as multiples'
                                    minItems: 1
                                    maxItems: 6
                                    type: array
                                    items:
                                      type: number
                                      minimum: 0.1
                                      maximum: 10
                                  form:
                                    description: 'copy: Fields readers fill'
                                    maxItems: 8
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        name:
                                          type: string
                                          maxLength: 30
                                          pattern: ^\w+$
                                        label:
                                          type: string
                                          minLength: 1
                                          maxLength: 60
                                      required:
                                        - name
                                        - label
                                      additionalProperties: false
                                  template:
                                    description: 'copy: Their words go in its {name} slots'
                                    type: string
                                    maxLength: 2000
                                  url:
                                    description: 'embed: https'
                                    type: string
                                    maxLength: 2000
                                    format: uri
                                  aspect:
                                    description: embed
                                    type: string
                                    enum:
                                      - '16:9'
                                      - '4:3'
                                      - '1:1'
                                      - auto
                                  prompt:
                                    description: 'request: What to ask for'
                                    type: string
                                    maxLength: 300
                                additionalProperties: false
                            required:
                              - template
                            additionalProperties: false
                          after:
                            description: >-
                              Add it after this section; null for the top; the
                              end when left out
                            type:
                              - string
                              - 'null'
                        required:
                          - op
                          - section
                        additionalProperties: false
                      - type: object
                        properties:
                          op:
                            type: string
                            const: update
                          id:
                            type: string
                          set:
                            type: object
                            propertyNames:
                              type: string
                            additionalProperties: {}
                            description: >-
                              What changes, e.g. { title, keys, props }; null
                              clears a field. props is replaced whole; template
                              can change too
                        required:
                          - op
                          - id
                          - set
                        additionalProperties: false
                      - type: object
                        properties:
                          op:
                            type: string
                            const: move
                          id:
                            type: string
                          after:
                            description: After this section; null for the top
                            type:
                              - string
                              - 'null'
                        required:
                          - op
                          - id
                          - after
                        additionalProperties: false
                      - type: object
                        properties:
                          op:
                            type: string
                            const: remove
                          id:
                            type: string
                        required:
                          - op
                          - id
                        additionalProperties: false
                      - type: object
                        properties:
                          op:
                            type: string
                            const: page
                          set:
                            type: object
                            properties:
                              title:
                                type: string
                                minLength: 1
                                maxLength: 120
                              hidden:
                                type: boolean
                              position:
                                type: integer
                                minimum: 0
                                maximum: 9007199254740991
                              slug:
                                type: string
                                maxLength: 60
                                pattern: ^[a-z0-9]+(-[a-z0-9]+)*$
                                description: Renames it; the old slug keeps working
                              parent:
                                description: >-
                                  Its parent page; null for the top. Three
                                  levels at most
                                anyOf:
                                  - type: string
                                    maxLength: 60
                                    pattern: ^[a-z0-9]+(-[a-z0-9]+)*$
                                  - type: 'null'
                              eyebrow:
                                anyOf:
                                  - type: string
                                    maxLength: 120
                                  - type: 'null'
                              lede:
                                anyOf:
                                  - type: string
                                    maxLength: 1000
                                  - type: '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:
                                anyOf:
                                  - type: string
                                    enum:
                                      - folder
                                      - photo
                                      - palette
                                      - brush
                                      - camera
                                      - movie
                                      - music
                                      - star
                                      - heart
                                      - flag
                                      - bookmark
                                      - briefcase
                                      - building-store
                                      - speakerphone
                                      - rocket
                                      - sparkles
                                      - leaf
                                      - world
                                      - users
                                      - archive
                                  - type: 'null'
                              audience:
                                type: string
                                enum:
                                  - everyone
                                  - partners
                                  - members
                                description: 'On portals: who may read it'
                              tabs:
                                description: Its child pages as tabs across its top
                                type: boolean
                              layout:
                                description: >-
                                  landing: no nav column, on-this-page or pager,
                                  for a home or campaign page; book when left
                                  out
                                type: string
                                enum:
                                  - book
                                  - landing
                              translations:
                                description: Its words by language tag
                                anyOf:
                                  - type: object
                                    propertyNames:
                                      type: string
                                      maxLength: 20
                                      pattern: ^[a-z]{2,3}(-[a-z0-9]{2,8})?$
                                    additionalProperties:
                                      type: object
                                      properties:
                                        title:
                                          type: string
                                          maxLength: 120
                                        eyebrow:
                                          type: string
                                          maxLength: 120
                                        lede:
                                          type: string
                                          maxLength: 1000
                                      additionalProperties: false
                                  - type: 'null'
                            additionalProperties: false
                        required:
                          - op
                          - set
                        additionalProperties: false
                  description: Applied in order; all or none
              required:
                - ops
              additionalProperties: false
      responses:
        '200':
          description: The page
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      brand:
                        type: string
                      page:
                        type: object
                        properties:
                          slug:
                            type: string
                          title:
                            type: string
                          position:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          hidden:
                            type: boolean
                          parent:
                            description: The page it sits under; null at the top
                            type:
                              - string
                              - 'null'
                          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
                          aliases:
                            type: array
                            items:
                              type: string
                            description: 'Slugs it had before a rename: they still find it'
                          layout:
                            type: string
                            enum:
                              - book
                              - landing
                            description: >-
                              landing: a front with no nav column, on-this-page
                              or pager; book: a chapter
                          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)))$
                            description: The last change to what it says
                          translations:
                            description: Its title, eyebrow and lede by language tag
                            anyOf:
                              - type: object
                                propertyNames:
                                  type: string
                                additionalProperties:
                                  type: object
                                  properties:
                                    title:
                                      type: string
                                    eyebrow:
                                      type: string
                                    lede:
                                      type: string
                                  additionalProperties: false
                              - 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
                                    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
                        required:
                          - slug
                          - title
                          - position
                          - hidden
                          - parent
                          - eyebrow
                          - lede
                          - cover
                          - icon
                          - audience
                          - tabs
                          - aliases
                          - layout
                          - updatedAt
                          - sections
                        additionalProperties: false
                      warnings:
                        type: array
                        items:
                          type: string
                        description: >-
                          What a reader would trip on, though it saves: links
                          that go nowhere, keys with no rule
                      url:
                        type: string
                        format: uri
                        description: Where a member reads it in the app
                    required:
                      - brand
                      - page
                      - warnings
                      - url
                    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
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

````