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.