Setup
- Open your form in the dashboard and go to the Integrations tab
- Choose Webhook
- Enter your endpoint URL
- Optionally enter a Signing Secret: any random string you choose. Store the same value on your server to verify requests
- Save
OSForms sends a POST request with Content-Type: application/json and User-Agent: osforms-Webhook/1.0:
data holds exactly what was submitted. Keys are your input name attributes (HTML forms) or field IDs (forms built with the form builder or @osforms/react).
Through the API you can also switch the method to PUT or PATCH and add custom headers, such as an Authorization header for your endpoint.
Verifying signatures
When a signing secret is set, every request includes an X-osforms-Signature header. Its value is the lowercase hex HMAC-SHA256 of the raw request body, keyed with your secret. There is no sha256= prefix.
Verify it against the raw body before parsing the JSON:
Verify the signature before processing a webhook, and compare with
timingSafeEqual to avoid timing attacks. Without a signing secret, requests
are unsigned and anyone who knows your URL can send fake submissions.
Retry behavior
Webhooks are not retried. If your endpoint returns a non-2xx status or times out:
- The delivery is logged as failed for that submission
- You get an in-app notification and an email alert
- You can see the error in the submission’s integration logs in the dashboard
Missed a delivery? Fetch the submission with the Pull Submissions API.
Timeout
Webhook requests time out after 30 seconds. Respond quickly and do slow work after responding.
Testing
Once the webhook is saved, use Test Webhook in its settings to send a sample payload to your endpoint and check your signature verification.