Webhooks
Register a URL on a survey and it gets a signed POST the moment a response is submitted — no
polling, no rate-limit cost. Works with n8n, Zapier, Make, or your own server.
Setting one up
This is per-survey, not account-wide: open a survey's editor → Settings → Integrations → Webhooks → add a URL. The signing secret is shown once, right when you add it — copy it then. Free plan allows 1 webhook per survey; Pro and above are unlimited.
Payload
POST <your_url>
Content-Type: application/json
X-Surveyee-Signature: sha256=<hmac hex digest>
X-Surveyee-Event: response.created
{
"event": "response.created",
"surveyId": "9eed35b9-...",
"submittedAt": "2026-07-21T10:04:20.627Z"
}The payload is intentionally minimal — an event notification, not the response content. Fetch the actual answers
with GET /api/v1/surveys/{id}/responses using your API key.
Verifying the signature
X-Surveyee-Signature is an HMAC-SHA256 of the raw request body, using the secret shown when you
added the webhook:
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawRequestBody)
.digest('hex');
// compare with the X-Surveyee-Signature header using a
// constant-time comparison (crypto.timingSafeEqual), not ===Retries
If your endpoint doesn't return a 2xx, delivery is retried after 1s, 5s, then 30s (4 attempts total)
before being dropped. Each attempt times out after 10s.