Skip to main content
Webhooks let you receive HTTP notifications whenever something happens in FormFlows.ai — a form is published, a submission is created, or a submission is updated. When an event occurs, FormFlows.ai sends a POST request with a JSON payload to your registered URL.

Register a webhook

POST /webhooks Registers a new webhook endpoint.

Body parameters

string
required
The HTTPS URL that FormFlows.ai will send event payloads to. Must be publicly accessible.
string[]
required
Array of event types to subscribe to. Supported events:
  • submission.created — A new submission is received on a form.
  • submission.updated — An existing submission is modified.
  • form.published — A form’s status changes to published.
string
Restrict this webhook to events from a specific form. Omit to receive events from all forms in your account.
string
A signing secret you choose. If provided, FormFlows.ai signs every payload with HMAC-SHA256 using this secret and includes the signature in the X-FormFlows-Signature header. Use this to verify that payloads genuinely come from FormFlows.ai.

Response

string
Unique webhook identifier, prefixed with whk_.
string
The registered endpoint URL.
string[]
List of event types this webhook is subscribed to.
string
The form this webhook is scoped to. null if it receives events from all forms.
string
ISO 8601 creation timestamp.
Example response:
The secret value you provide is never returned in API responses. The secret_set boolean confirms whether a signing secret is configured.

List webhooks

GET /webhooks Returns all registered webhooks in your account.

Query parameters

integer
default:"20"
Number of webhooks to return per page. Maximum 100.
string
Pagination cursor from a previous response’s next_cursor.

Delete a webhook

DELETE /webhooks/{id} Removes a registered webhook. FormFlows.ai will stop sending events to that endpoint immediately.

Path parameters

string
required
The webhook ID to delete, e.g. whk_6mNoP8qRsT.

Response

Returns a 204 No Content response on success.

Webhook payload format

When a subscribed event occurs, FormFlows.ai sends a POST request to your URL with the following JSON body:

Payload fields

string
The event type that fired. One of submission.created, submission.updated, or form.published.
string
The ID of the form that the event is associated with.
string
ISO 8601 timestamp of when the event occurred.
object
Event-specific data.

Signature verification

If you set a secret when registering your webhook, every request includes an X-FormFlows-Signature header:
The value is sha256= followed by the hex-encoded HMAC-SHA256 of the raw request body, computed using your secret as the key. Always verify this signature before processing a payload to confirm it came from FormFlows.ai.
Compare signatures using a constant-time comparison function. Using a regular string equality check (==) is vulnerable to timing attacks.

Retry policy

FormFlows.ai considers a delivery successful when your endpoint returns any 2xx HTTP status code within 10 seconds. If the request times out or returns a non-2xx status, FormFlows.ai retries the delivery with exponential backoff: After 5 failed attempts, the event is marked as undeliverable and no further retries occur.
Your endpoint must respond within 10 seconds. If your processing logic takes longer than that, return a 200 immediately and handle the payload asynchronously (e.g., push it to a queue).
Because retries can deliver the same event more than once, make your handler idempotent. Use data.submission_id or timestamp to detect and skip duplicate deliveries.