Overview
Webhooks let you receive interview data in real time. After you register a webhook, User Intuition sends an HTTPPOST request to your hook_url every time any
interview in your account is completed — no polling required. A webhook is
account-wide: it covers every study, so you register it once, not per study.
Each request contains the completed interview in the same public shape returned
by Get Interview: study_id, the
participant, status, quality, messages, recording links, and screener
responses.
1
Register a webhook
Call Create Webhook with the
hook_url
that should receive completed interviews. There is no study_id — the webhook
covers your whole account. The response includes a signing_secret (shown
once) — store it securely to verify signatures.2
Receive interview data
When any interview in your account completes, your endpoint receives a
POST
request with the interview payload described below.3
Stop receiving data
Call Delete Webhook with the same
hook_url to unregister it.Webhooks are account-wide: one registration receives completed interviews for
every study in your account. You can register more than one
hook_url, and each
receives a copy of every completed interview. Use the payload’s study_id to tell
which study an interview belongs to.Delivery behavior
Payload
The request body is the completed interview, using the same public field names as the rest of the API. The participant who took the interview is nested underparticipant.
Fields
Anonymous panel interviews have no identifiable participant, so
participant is
null for them. Internal columns (transcripts of the raw call, internal IDs, and
the like) are never included — the webhook delivers exactly the public interview
shape.Authentication
Every delivery is signed so you can verify it genuinely came from User Intuition. When you register a webhook, the response includes asigning_secret (prefixed
whsec_, shown once). Each request carries two headers:
Verifying a signature
Recompute the HMAC over"<timestamp>.<raw request body>" using your stored
signing_secret and compare it to X-UI-Signature in constant time. Use the
raw request body bytes — do not re-serialize the parsed JSON, or the signature
won’t match.
1
Verify the signature
Reject any request whose
X-UI-Signature doesn’t match your recomputed HMAC.2
Check the timestamp
Reject requests with an
X-UI-Timestamp outside a small window (e.g. 5 minutes)
to prevent replay attacks.3
Use HTTPS
Always register an
https:// URL so the payload is encrypted in transit.Managing webhooks
Create Webhook
Register a
hook_url to receive completed interviews for a study.Delete Webhook
Stop sending completed interviews to a
hook_url.
