Automation tools get new submissions through REST hooks: a subscription adds an HTTP destination to the form that posts the submission.created event to the tool’s URL. Unsubscribing deletes it. Hook deliveries are retried and logged like any other destination.
| Endpoint | Description |
|---|---|
POST /api/v1/hooks |
Subscribe a URL to a form’s new submissions. |
DELETE /api/v1/hooks/{hook} |
Unsubscribe. |
GET /api/v1/forms/{form}/sample |
A sample event, for mapping fields while you build. |
All three take a team API key as Authorization: Bearer <api_key>. See API.
Subscribe
curl -X POST https://YOUR-QUICKFORMS-HOST/api/v1/hooks \
-H "Authorization: Bearer $QUICKFORMS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"form_id": "FORM_ID", "target_url": "https://hooks.zapier.com/hooks/standard/1/abc", "name": "Zapier"}'{
"data": {
"id": "01jcd3n5p7q9r1s3t5v7w9x1y3",
"form_id": "01jc8xk2m5t9qw3e7r4y6u8v0p",
"type": "http",
"service": "HTTP request",
"name": "Zapier",
"enabled": true,
"config": { "url": "https://hooks.zapier.com/hooks/standard/1/abc", "method": "POST", "body": "event" },
"mapping": { "name": "{{name}}", "email": "{{email}}", "message": "{{message}}" },
"conditions": [],
"created_at": "2026-11-06T10:24:00.000000Z",
"updated_at": "2026-11-06T10:24:00.000000Z"
}
}| Field | Required | Description |
|---|---|---|
form_id |
Yes | The form to subscribe to. |
target_url |
Yes | Where to send each event. An https URL, up to 2048 characters. |
name |
No | The destination’s name, shown in the delivery log. Defaults to Automation hook. |
The response is the new destination. Keep its id: it is the hook ID you unsubscribe with. The IDs are illustrative.
The hook counts towards the form’s 20 destinations. A form outside the API key’s team returns a 404, and an invalid target_url a 422.
Unsubscribe
curl -X DELETE https://YOUR-QUICKFORMS-HOST/api/v1/hooks/HOOK_ID \
-H "Authorization: Bearer $QUICKFORMS_TOKEN" \
-H "Accept: application/json"Returns 204. The hook ID must be an HTTP destination on one of your team’s forms, otherwise the response is a 404.
What the hook receives
Each submission is a POST with Content-Type: application/json and User-Agent: quickforms-destinations/1.0. The body is the same submission.created event as the form webhook:
{
"id": "evt_01jca9qf3tz5b8m2k7w4r6x0hn",
"type": "submission.created",
"created_at": "2026-11-06T10:24:00+00:00",
"sandbox": false,
"form": { "id": "01jc8xk2m5t9qw3e7r4y6u8v0p", "name": "Contact" },
"submission": {
"id": "01jca9qf3tz5b8m2k7w4r6x0hn",
"data": { "name": "Ada Lovelace", "email": "ada@example.com", "message": "Hello" },
"confirmed_at": null,
"link": null,
"created_at": "2026-11-06T10:24:00+00:00"
}
}- Hooks are not signed. To sign them, set the destination’s
signsetting toyeswithPATCH /api/v1/destinations/{destination}. See HTTP request. - Like every destination, hooks are held for spam review and double opt-in, and are never sent for sandbox submissions.
- File fields include a signed download link.
Sample event
GET /api/v1/forms/{form}/sample returns a list with one event. It is built from the form’s latest submission, so the tool can show your real fields while you map them.
curl https://YOUR-QUICKFORMS-HOST/api/v1/forms/FORM_ID/sample \
-H "Authorization: Bearer $QUICKFORMS_TOKEN" \
-H "Accept: application/json"If the form has no submissions yet, the event is made up from the form’s fields, with Example for every answer:
{
"data": [
{
"id": "evt_sample",
"type": "submission.created",
"sandbox": true,
"form": { "id": "01jc8xk2m5t9qw3e7r4y6u8v0p", "name": "Contact" },
"submission": {
"id": "sample",
"data": { "name": "Example", "email": "Example", "message": "Example" }
}
}
]
}Zapier
The repository includes a Zapier Platform CLI app in integrations/zapier. It hasn’t been published to Zapier, so push it to your own Zapier account to use it.
Push the app
npm i -g zapier-platform-cli
cd integrations/zapier
npm install
zapier register "quickforms"
zapier pushConnect an account
When you connect quickforms in Zapier, it asks for:
| Field | Description |
|---|---|
| quickforms URL | Where your quickforms app runs, without a trailing slash. |
| API key | A team API key. |
Zapier checks the connection with GET /api/v1/me and labels it with your team’s name. Every request sends the API key as Authorization: Bearer <api_key>.
New submission trigger
Triggers when a form receives a submission, after spam checks and double opt-in.
- Pick the form from a dropdown of your forms.
- Turning the Zap on subscribes with
POST /api/v1/hooks(namedZapier), and turning it off unsubscribes. - Each submission gives the Zap the submission’s
id,data,confirmed_at,linkandcreated_at, plusformandsandbox. - When you test the trigger, Zapier loads the form’s 10 latest live submissions from
GET /api/v1/forms/{form}/submissions.
Send test submission action
Sends a sandbox test submission with POST /api/v1/forms/{form}/test-submissions and returns the stored submission. Nothing is emailed or posted.
| Field | Description |
|---|---|
| Form | The form to test. |
| Answers | Field name and value pairs. |
n8n
No custom n8n node is needed.
Trigger a workflow
Add an n8n Webhook node and copy its URL, then either:
- Add an HTTP request destination to the form, pointing at that URL with
bodyset toevent. Do this from the form’s Destinations tab in the dashboard, or with the API. - Or subscribe from a workflow with an HTTP Request node calling
POST /api/v1/hooks, and unsubscribe withDELETE /api/v1/hooks/{hook}.
Use GET /api/v1/forms/{form}/sample to get an event to map fields from.
Call quickforms from a workflow
Use the HTTP Request node against the API, with header auth: Authorization set to Bearer <api_key>. For example, POST /api/v1/forms/{form}/test-submissions sends a sandbox test submission.
Make
The same works for Make: point an HTTP request destination with body set to event at a Make custom webhook, or subscribe with POST /api/v1/hooks.