Skip to main content
A page is an ordered list of blocks. Each block carries a type, a config object whose shape is determined by type, and rendering hints (sort_order, spacing). This page documents the wire shape for every block type currently registered.
The dashboard editor is the authority for block authoring — v1 Pages is read-only. This page describes the read shape your client receives from GET /pages/{id}.

The block envelope

Every block has the same outer shape:
string (uuid)
required
Stable UUID for this block. Referenced from form submissions (each submitted field is keyed on its block id).
string
required
Block type. One of the values listed below. New types may be added without an OpenAPI version bump — treat unknown types as opaque.
object
required
Configuration for this block. Shape depends on type. The schema types this as unknown; see the per-type sections below for the exact shape.
integer
required
Display order. The blocks[] array is already returned sorted by this field — use it for stable ordering across refetches.
integer
required
Top padding in pixels.
integer
required
Bottom padding in pixels.

Categories


Content blocks

heading

text

image

video

divider


Action blocks

button

contact

Renders as a tap-to-save vCard on mobile.

file


Form blocks

All form fields share a formBase schema and extend it with field-specific keys. The base: The submitted value is keyed by block id in the submission’s data map — see Submissions.

form_text

Extra keys: maxLength (integer).

form_textarea

Extra keys: rows (integer, default 4), maxLength (integer).

form_email

Form-base only. The renderer enforces email validation.

form_phone

Form-base only. The renderer renders a phone-input widget.

form_number

Extra keys: min, max, step (numbers).

form_select

Extra keys: options[] with { label, value, description? }. Always renders as a native-style dropdown — no variant.

form_radio

Extra keys: variant (list | cards, default cards), accentColor (hex), options[].

form_switch

Same shape as form_radio — multi-select toggle cards or list.

form_checkbox

Same shape as form_radio — multi-select with checkboxes.

form_rating

form_date

form_hidden

Hidden fields are never visually rendered. Prefill-from-URL is handled by the visible field blocks; this is a pure constant.

form_media

form_submit

Redirect rules are evaluated top-to-bottom, first match wins. The last rule should have condition: null (the fallback). Each rule:
Operators: eq, neq, gt, gte, lt, lte, in, not_in, contains.

Shared types

FaIcon

Font Awesome icon reference.
  • prefix — FA style prefix (fas, far, fab, fad, etc.).
  • iconName — kebab-case icon name.

Button style

  • variant — filled or outline.
  • bgColor, textColor — hex.
  • borderRadius — px.
  • borderWidth — px. Ignored when variant = "filled".

Page destination

The destination object used by button blocks (and form submit redirects). Discriminated on type:
The destination embeds enough of the target’s metadata (title, slug, etc.) so renderers can hyperlink without an extra lookup. The embedded values are a snapshot — refresh by re-reading the page if you need the latest.

Forward compatibility

New block types may be added without an OpenAPI version bump — they’re additive. Treat any unknown type as opaque and skip rendering rather than crashing. The config field is typed as unknown on the wire precisely so additions don’t break existing consumers.