Skip to main content
A submission is a UUID-keyed record describing one form response from a visitor on a public Page.

Identifiers

string
required
Always "submission".
string
required
UUID. Use as your foreign key in external systems.
string | null
UUID of the Page the submission came from. null if the parent page was deleted.
integer
required
Sequential, per-organization counter. The dashboard formats it as SUB-0001; the wire value is the raw integer.

Status, priority, flag

string
required
One of new, read, in_progress, resolved, spam. Default is new.
string
required
One of none, low, medium, high. Default is none.
boolean
required
Free-floating “needs attention” toggle. Independent of status and priority.

Assignment

string | null
UUID of the user who owns this submission. null means unassigned.
string | null
UUID of the user who resolved the submission. Stamped automatically when status moves to resolved and the actor is an OAuth user; it stays null when an API key performs the resolve (there’s no user to attribute). Clear via PATCH with null to undo.
string | null
ISO 8601 timestamp when the submission was resolved. Auto-stamped by the server the moment status moves to resolved. You may also set it explicitly via PATCH; a malformed value (not a parseable ISO 8601 timestamp) is rejected with 400.
string | null
Free-text internal annotation. Not visible to the visitor.

Data

object
required
The form response itself, keyed by block ID (not field label). Each entry has the shape:
  • type — the form block type (form_text, form_email, form_textarea, form_select, form_checkbox, …).
  • label — the author-set label at submission time. Survives subsequent edits to the page.
  • value — the submitted value. string for most fields, string[] for multi-select / checkboxes, null for empty optional fields, number for numeric inputs.
  • order — the block’s sort order on the page when the submission was captured. Use this to render fields in form order, since JSON object keys aren’t ordered.
Block IDs are stable across page edits but field labels are not. If you’re mapping submission data to external system fields, key on block ID. Use label only for display.
object
required
Free-form key/value pairs captured at submit time. Common keys: utm_source, utm_medium, utm_campaign, referrer, user_agent. May be {} but never null.

Attribution

string | null
QR code the visitor scanned to reach the page. Server-resolved from a session cookie — visitors can’t forge this.
string | null
Product whose scan URL drove this visit. Server-resolved.
string | null
Custom object whose /o/<slug> URL drove this visit.
string | null
Conversation that presented the form, if the submission originated from a chatbot’s present_page tool call rather than a direct page visit.

Destination

object | null
The redirect destination resolved at submit time. The page’s block configuration determines what the visitor sees after submitting; this field records what was applied. null means the visitor saw the default thank-you screen.Shape is a tagged union on type:

Activity

string | null
ISO 8601. When the visitor first loaded the page. null if not captured (legacy submissions).
number | null
Seconds between viewed_at and created_at — time-to-complete. null when viewed_at is null.

Timestamps

string
required
ISO 8601. When the visitor submitted.

Complete example