Folia
API

Webhooks

The outbound event shape, fixed now so integrations can be built before delivery is switched on.

Webhook delivery is not yet enabled. The event shape is final and documented here so that anything you build against it will keep working when delivery ships; there will be no second migration.

Envelope

Every event is one JSON object:

{
  "id": "6b1f…",
  "type": "submission.accepted",
  "occurredAt": "2026-09-24T18:02:11.412Z",
  "data": { … }
}

id is unique per event and stable across retries — use it to de-duplicate. type selects the data shape. occurredAt is when the thing happened, not when the request was sent.

Events

submission.accepted

A visitor's submission created a contact, either automatically or because a planner accepted it from the review queue. Every accepted submission gets a new contact of its own, even when the planner already has a contact with the same email.

{
  "data": {
    "submission": { "id": "…", "formId": "…", "status": "accepted", "answers": { … }, "questions": [ … ] },
    "contactId": "…"
  }
}

submission.flagged

A submission was stored but is waiting for the planner to look at it. No contact exists yet; a submission.accepted event follows if they accept it.

{
  "data": {
    "submission": { "id": "…", "formId": "…", "status": "flagged", "answers": { … }, "questions": [ … ] }
  }
}

Both events carry the same submission object: the answers as submitted, a frozen copy of the form's questions at submission time so the answers stay readable after the form changes, the pageUrl the visitor was on if the page sent one, and timestamps.

Delivery (planned)

When enabled: POST to your URL with Content-Type: application/json, a signature header over the raw body, retries with backoff for non-2xx responses for up to 24 hours, and events in the order they occurred per form. Endpoints will be configured per account in CRM settings.