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.| State | Meaning |
|---|---|
new | Just arrived. Hasn’t been opened. |
read | An agent has seen it. |
in_progress | Someone’s actively working it. |
resolved | Handled. Auto-stamps resolved_at; also stamps resolved_by when an OAuth user resolves (left null for API-key callers). |
spam | Junk. Hidden from default views. |
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
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
EveryPATCH produces an event row. Read the full history of a submission with GET /submissions/{id}/events.
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
| Event | Fires when |
|---|---|
page.submission.created | A new submission is received. Payload includes the full submission record. |
submission.updated | Any 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.
