Edesy Forms sends each new response as JSON to the endpoint you choose. Add custom headers, send a test event and check recent deliveries. Included on the Free plan.
Simple, predictable delivery of each new response
Each new response is sent to your URL as soon as it is saved. Nothing to poll.
Form details, answers keyed by question ID and source details in one JSON object.
POST by default, or PUT or PATCH. Add custom headers such as an API key or bearer token.
Send a sample request from the app to check your endpoint before going live.
See the last 20 attempts with status, time, duration and any error message.
Apply one webhook to all your forms, or connect it to the forms you choose.
Five steps in the Edesy Forms app
Each request has the header Content-Type: application/json plus any custom headers you added. The body looks like this (values are illustrative):
{
"formId": "form id",
"formTitle": "Contact us",
"responseId": "response id",
"submissionId": "readable submission reference",
"submittedAt": "2026-09-17T10:30:00.000Z",
"responses": {
"<question id 1>": "Priya Sharma",
"<question id 2>": "[email protected]",
"<question id 3>": "I would like a callback"
},
"metadata": {
"userAgent": "Mozilla/5.0 ...",
"ipAddress": "203.0.113.10",
"referrer": "https://example.com/contact",
"utm": { "utm_source": "google", "utm_campaign": "diwali" },
"embedOrigin": "https://example.com"
}
}
This Node.js (Express) example checks a secret header, saves the lead and replies with 200 straight away:
import express from "express";
const app = express();
app.use(express.json());
app.post("/hooks/edesy-forms", (req, res) => {
if (req.get("X-Api-Key") !== process.env.FORMS_WEBHOOK_KEY) {
return res.sendStatus(401);
}
const { formTitle, responseId, submittedAt, responses, metadata } = req.body;
// Reply first; anything outside 2xx is logged as a failed delivery.
res.sendStatus(200);
saveLead({ formTitle, responseId, submittedAt, responses, source: metadata?.utm });
});
app.listen(3000);
In the webhook settings, add the header as JSON: {"X-Api-Key": "your-long-random-secret"}.
To see the exact body before writing any code, point the webhook at a request inspector such as webhook.site, then submit your form once.
Full control over what happens to each response
Plain JSON
Parse it in Node, Python, PHP, Go or anything else
Your logic
Decide what happens to each response
Visible failures
Errors show up in Recent deliveries
Non-blocking
A failing endpoint never breaks the form
Custom headers
Send a secret your endpoint can check
HTTPS endpoints
Use an https:// URL for encryption in transit
Scoped to forms
Only the forms you choose send to the URL
Test first
Check your endpoint with a sample request
Where teams send their form responses
Validate, enrich or store responses with your own logic, in any language that can accept an HTTP request.
Write each response to Postgres, MySQL or any data store through a small endpoint you control.
Send new leads into Edesy CRM so your sales team can pick them up right away.
Trigger a WhatsApp message through WAFlow when someone fills in your form.
Start a call from the Edesy AI voice agent minutes after a lead submits.
Pass responses to an internal tool, ticket queue or chat bot that accepts webhooks.
Common questions about Edesy Forms webhooks
Use Zapier to pass responses to other apps, or see every integration
Sign up free, build a form and add a webhook in a few minutes.