Skip to main content
A submission is a form response from a visitor on one of your public Pages. The API lets you read submissions, triage them through a status workflow, assign owners, and pull a full activity timeline.
Submissions are created when a visitor submits a form on a public page — never through the API. The API is read-and-update only. To create a submission, point a Page at your form blocks and capture the visitor traffic.

Triage workflow

Submissions move through a five-state status machine, with priority, flag, assignee, and notes layered on top.
StateMeaning
newJust arrived. Hasn’t been opened.
readAn agent has seen it.
in_progressSomeone’s actively working it.
resolvedHandled. Auto-stamps resolved_at; also stamps resolved_by when an OAuth user resolves (left null for API-key callers).
spamJunk. Hidden from default views.
Priorities are none, low, medium, high. flagged is a separate boolean for “needs attention” callouts. assignee_id is the user owning the row. notes is free-text internal annotation.

The shape of a submission

{
  "object": "submission",
  "id": "d4c5e6f7-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
  "page_id": "7a8b9c0d-1e2f-4a3b-9c8d-0e1f2a3b4c5d",
  "submission_number": 421,
  "status": "new",
  "priority": "medium",
  "flagged": false,
  "assignee_id": null,
  "resolved_by": null,
  "resolved_at": null,
  "notes": null,
  "data": {
    "blk_h3yt2": { "type": "form_text",  "label": "Name",    "value": "Jamie Lee", "order": 0 },
    "blk_qm8wp": { "type": "form_email", "label": "Email",   "value": "[email protected]", "order": 1 },
    "blk_n21vr": { "type": "form_textarea", "label": "Message", "value": "Loved the launch — any chance of a demo this week?", "order": 2 }
  },
  "metadata": { "utm_source": "linkedin" },
  "destination": { "type": "url", "value": { "url": "https://yoursite.com/thanks" } },
  "viewed_at": "2026-05-22T10:14:01+00:00",
  "duration_seconds": 38,
  "qr_code_id": null,
  "product_id": null,
  "object_id": null,
  "conversation_id": null,
  "created_at": "2026-05-22T10:14:39+00:00"
}
See the Submission object page for the full field reference.

What you can do

Read

GET /submissions (list, filter, paginate) and GET /submissions/{id} (single record).

Triage

PATCH /submissions/{id} to update status, priority, flagged, assignee, notes.

Audit

GET /submissions/{id}/events returns the full activity timeline — every field change with actor and timestamp.

React

Subscribe to page.submission.created and submission.updated webhooks.

Activity timeline

Every PATCH produces an event row. Read the full history of a submission with GET /submissions/{id}/events.
{
  "object": "submission_event",
  "id": "f9e8d7c6-5b4a-4e3d-9c2b-1a0e9d8c7b6a",
  "submission_id": "d4c5e6f7-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
  "actor_id": "c2d4f6a8-1b3e-4d5f-9a8c-7b6e2f1d0a9b",
  "event_type": "status_changed",
  "data": { "type": "status_changed", "from": "new", "to": "in_progress" },
  "created_at": "2026-05-22T10:21:48+00:00"
}
Event types: created, status_changed, priority_changed, flagged, unflagged, assigned, unassigned, notes_updated. The actor_id is the user (or API key — surfaced via metadata internally) who made the change; null for system-generated events like created.

Webhook events

EventFires when
page.submission.createdA new submission is received. Payload includes the full submission record.
submission.updatedAny field is changed via PATCH. Payload includes the changes diff.
Submissions don’t have a delete endpoint. The terminal “this isn’t real” state is status: "spam", which hides the record from default views but preserves the audit trail.