Skip to main content
A Page is returned as a JSON object with object: "page". GET /pages/{id} extends the shape with a blocks[] array — the full ordered block tree, documented on Blocks.

Example

{
  "object": "page",
  "id": "c4d5e6f7-8a9b-4c0d-1e2f-3a4b5c6d7e8f",
  "slug": "fall-tasting",
  "public_slug": "fall-2024-tasting",
  "status": "active",
  "title": "Fall 2024 Tasting Notes",
  "description": "Six wines, six stories.",
  "background": {
    "type": "gradient",
    "value": "linear-gradient(to bottom right, #f9f4ec, #e6d6b8)",
    "animated": false
  },
  "island": {
    "color": "#ffffff",
    "opacity": 1,
    "shadow": "md",
    "roundness": "3xl"
  },
  "favicon_url": "https://files.awardee.dev/orgs/.../favicon.ico",
  "meta_title": "Fall 2024 Tasting Notes — Reserve Wines",
  "meta_description": "Six wines, six stories. The full set of fall tasting notes.",
  "og_image_url": "https://files.awardee.dev/orgs/.../og.jpg",
  "view_count": 8421,
  "created_at": "2024-08-30T15:01:09Z",
  "updated_at": "2026-05-12T11:42:00Z",
  "blocks": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "type": "heading",
      "config": { "text": "Fall 2024", "level": 1, "alignment": "center" },
      "sort_order": 0,
      "spacing_top": 0,
      "spacing_bottom": 16
    },
    {
      "id": "22222222-2222-4222-8222-222222222222",
      "type": "text",
      "config": {
        "content": "Six wines, six stories.",
        "alignment": "center"
      },
      "sort_order": 1,
      "spacing_top": 0,
      "spacing_bottom": 24
    },
    {
      "id": "33333333-3333-4333-8333-333333333333",
      "type": "image",
      "config": {
        "url": "https://files.awardee.dev/orgs/.../tasting-hero.jpg",
        "fileName": "tasting-hero.jpg"
      },
      "sort_order": 2,
      "spacing_top": 0,
      "spacing_bottom": 24
    },
    {
      "id": "44444444-4444-4444-8444-444444444444",
      "type": "button",
      "config": {
        "label": "Reserve a tasting",
        "iconPosition": "end-gap",
        "destination": {
          "type": "url",
          "value": { "url": "https://example.com/book" }
        }
      },
      "sort_order": 3,
      "spacing_top": 0,
      "spacing_bottom": 0
    }
  ]
}

Identifiers

object
string
required
Always "page".
id
string (uuid)
required
Stable UUID. Use this in /pages/{id} and as the target of destination.page on QR codes and products.
slug
string
required
Operator-facing slug. Editable in the dashboard. Used for internal dashboard navigation and as the default surface name when no public_slug is set.
public_slug
string
required
The slug exposed in public page URLs. Distinct from slug because the operator may want a clean public address that’s independent of internal renames. Stable within the page’s life; changes only on explicit operator edit.

Status

status
string
required
One of draft, active, inactive, archived. See the overview for behaviour per status.

Content

title
string
required
Page title. Rendered in the editor’s tab and used as the default <title> when meta_title is unset.
description
string | null
Free-form description. Operator-facing — distinct from meta_description below.

Background

background
object
required
The page background. Discriminated on type: color, gradient, image, or video.

Island

The “island” is the content card that sits on the background.
island
object
required

Meta

favicon_url
string | null
URL for the browser tab favicon. null falls back to the org default.
meta_title
string | null
Override for the <title> tag. Falls back to title when unset.
meta_description
string | null
Override for the <meta name="description"> tag. Falls back to description when unset.
og_image_url
string | null
Override for the Open Graph image. Used by social previews. Falls back to a brand default when unset.

Stats

view_count
integer
required
Lifetime view count. Increments on every public render. Read-only.

Timestamps

created_at
string (datetime)
required
When the page was created.
updated_at
string (datetime)
required
Last mutation timestamp.

Blocks

GET /pages/{id} extends the response with a blocks[] array, ordered by sort_order. Each block has the envelope:
{
  "id": "block-uuid",
  "type": "heading",
  "config": { /* shape depends on type */ },
  "sort_order": 0,
  "spacing_top": 0,
  "spacing_bottom": 0
}
See Blocks for the per-type config shape.
blocks
array
Ordered list of block objects. Empty for blank pages.