Receive real-time HTTP notifications when events happen in your workspace.
🔗 Webhooks
Webhooks send real-time HTTP POST notifications to your server whenever something happens in your workspace. No polling, no delay — your systems get updated the moment a respondent starts or completes a voice response. ⚡
⚙️ Creating a Webhook
- Open the sidebar and go to Webhooks & Integrations.
- Click the + Create Webhook button in the top-right corner.
- A modal will appear with two fields:
- Webhook URL — Paste the HTTPS endpoint on your server that will receive events (e.g.
https://your-server.com/webhook). - Subscribe to Events — Check the events you want to receive. Each event shows its name and a brief description.
- Webhook URL — Paste the HTTPS endpoint on your server that will receive events (e.g.
- Click Create Webhook to save.
Your new webhook appears as a card in the Active Webhooks list, showing:
| Element | What it does |
|---|---|
| URL | Your endpoint URL displayed in monospace. |
| Event Tags | Blue badges showing which events this webhook is subscribed to. |
| Enabled Toggle | Switch the webhook on or off instantly — without deleting it. |
| Test Button (📤) | Send a test payload to your endpoint to verify it's reachable. |
| Delete Button (🗑️) | Permanently remove the webhook. |
| Delivery Stats | Shows the last delivery status (success/failed/pending), total delivery count, and last delivery timestamp. |
Recent Activity
Below the Active Webhooks section, you'll see a Recent Activity feed showing the last 10 deliveries across all your webhooks — with the event type, endpoint URL, timestamp, and status badge.
Integrations Showcase
The page also shows available integrations. Currently Custom Webhook is fully available. Zapier is available as a native integration. Slack is marked as Coming Soon.
📡 Available Events
Sayify currently supports 2 webhook events:
| Event | When it fires |
|---|---|
response.started |
A respondent has opened your intake link and begun a session. |
response.submitted |
A respondent has completed all questions and submitted their response. |
📨 HTTP Headers
Every webhook delivery includes these headers:
| Header | Description |
|---|---|
Content-Type |
application/json |
X-Sayify-Event |
The event type (e.g. response.started or response.submitted). |
X-Sayify-Delivery-Id |
A unique UUID for this specific delivery — useful for deduplication. |
X-Sayify-Signature |
HMAC-SHA256 signature for payload verification (see below). |
User-Agent |
Sayify-Webhooks/1.0 |
📦 Payload: response.started
Fired when a respondent opens your intake page and a session begins. This is a lightweight payload — useful for tracking engagement or triggering real-time dashboards.
{
"event": "response.started",
"timestamp": "2026-02-17T10:13:15.123Z",
"session": {
"uuid": "abc123-session-uuid-456",
"link_name": "Product Feedback Survey",
"link_slug": "product-feedback",
"link_uuid": "def789-link-uuid-012",
"started_at": "2026-02-17T10:13:15.123Z"
},
"respondent": {
"ip_address": "192.0.2.1",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"location": {
"country": "US",
"city": "San Francisco"
}
},
"workspace": {
"uuid": "workspace-uuid-123",
"name": "Acme Corp"
}
}
📦 Payload: response.submitted
Fired when a respondent completes and submits their response. This is the comprehensive payload — it includes all answers, AI evaluations, follow-up threads, and session metadata.
{
"event": "response.submitted",
"timestamp": "2026-02-17T10:13:30.794Z",
"session": {
"uuid": "abc123-session-uuid-456",
"link_name": "Product Feedback Survey",
"link_slug": "product-feedback",
"link_uuid": "def789-link-uuid-012",
"started_at": "2026-02-17T10:13:15.123Z",
"completed_at": "2026-02-17T10:13:30.794Z",
"duration_seconds": 15.67
},
"respondent": {
"ip_address": "192.0.2.1",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"location": {
"country": "US",
"city": "San Francisco"
}
},
"responses": {
"overall_experience": {
"question": "How would you rate your overall experience?",
"response_type": "voice",
"value": "I love the analytics feature! The dashboard is intuitive but I need better export options.",
"audio_url": "https://resource.sayify.pro/responses/abc123/audio.mp3",
"transcript": "I love the analytics feature! The dashboard is intuitive but I need better export options.",
"ai_evaluation": {
"clarity_score": 87,
"completion_status": "complete",
"extracted_fields": {
"sentiment": "positive",
"mentioned_features": ["analytics", "dashboard"],
"pain_points": ["export_options"]
},
"confidence_score": 0.92,
"insights": {
"sentiment_score": 8,
"urgency_level": "medium",
"feature_mention": ["analytics", "dashboard", "export"],
"action_required": "follow_up_on_export_feature",
"persona_tag": "power_user",
"executive_summary": "User loves current features but needs export functionality for business presentations"
}
},
"follow_ups": [
{
"question": "What specific export formats would you like?",
"value": "PDF and PowerPoint would be great for presentations",
"ai_evaluation": {
"clarity_score": 95,
"extracted_fields": {
"requested_formats": ["PDF", "PowerPoint"],
"use_case": "presentations"
}
}
}
]
},
"feature_rating": {
"question": "Rate our analytics feature",
"response_type": "rating",
"value": "9",
"ai_evaluation": {
"clarity_score": 100,
"completion_status": "complete",
"extracted_fields": { "rating": 9 },
"insights": {
"sentiment_score": 9,
"urgency_level": "low",
"feature_mention": ["analytics"],
"action_required": null,
"persona_tag": "satisfied_user",
"executive_summary": "High satisfaction with analytics feature"
}
}
},
"improvement_suggestions": {
"question": "What can we improve?",
"response_type": "text",
"value": "Add more customization options for charts",
"ai_evaluation": {
"clarity_score": 82,
"completion_status": "complete",
"extracted_fields": {
"category": "feature_request",
"specific_request": "chart_customization"
},
"insights": {
"sentiment_score": 6,
"urgency_level": "low",
"feature_mention": ["charts", "customization"],
"action_required": "product_team_review",
"persona_tag": "feature_requester",
"executive_summary": "User requests more chart customization options"
}
}
}
},
"ai_evaluation": {
"clarity_score": 85,
"completion_status": "complete",
"follow_up_count": 1,
"insights": {
"sentiment_score": 8,
"urgency_level": "medium",
"feature_mention": ["analytics", "dashboard", "export", "charts"],
"action_required": "follow_up_call",
"persona_tag": "power_user",
"executive_summary": "User loves analytics but needs better export options for presentations. Power user requesting chart customization."
}
},
"metadata": {
"total_questions": 3,
"answered_questions": 3,
"average_response_time": "5s",
"completion_percentage": 100
},
"workspace": {
"uuid": "workspace-uuid-123",
"name": "Acme Corp"
}
}
Response Object Fields
Each response is keyed by its field_key and contains:
| Field | Type | Description |
|---|---|---|
question |
string | The question prompt that was shown to the respondent. |
response_type |
string | One of: voice, text, rating, choice, multiselect, voice_text_fallback. |
value |
string | The respondent's answer — transcribed text for voice, chosen option for choice, etc. |
audio_url |
string | (voice only) Direct URL to the audio recording. |
transcript |
string | (voice only) Full transcription of the voice answer. |
ai_evaluation |
object | AI analysis including clarity score, extracted fields, and insights. |
follow_ups |
array | AI-generated follow-up Q&A pairs (if probing was enabled). |
Session-Level AI Evaluation
The top-level ai_evaluation object provides an overall assessment:
| Field | Type | Description |
|---|---|---|
clarity_score |
integer (0–100) | Overall clarity of all responses combined. |
completion_status |
string | complete, partial, or incomplete. |
follow_up_count |
integer | Number of AI follow-up questions that were asked. |
insights.sentiment_score |
integer (0–10) | Overall sentiment — 0 is very negative, 10 is very positive. |
insights.urgency_level |
string | low, medium, or high. |
insights.feature_mention |
array | Features or topics mentioned by the respondent. |
insights.action_required |
string / null | Suggested follow-up action, if any. |
insights.persona_tag |
string / null | AI-classified respondent persona. |
insights.executive_summary |
string | One-line summary of the entire response. |
🔄 Retry Policy
If your endpoint returns a non-2xx status code (or times out after 30 seconds), Sayify retries with exponential backoff:
| Attempt | Delay | Total wait |
|---|---|---|
| 1st retry | 1 minute | 1 min |
| 2nd retry | 5 minutes | 6 min |
| 3rd retry | 15 minutes | 21 min |
| 4th retry | 1 hour | 1 hr 21 min |
| 5th retry | 6 hours | 7 hr 21 min |
After 5 failed retries, the delivery is permanently marked as failed.
📋 Delivery Logs
View the full delivery history for each webhook in your dashboard under Integrations → Webhooks → Deliveries:
| Field | What it shows |
|---|---|
| Status | Pending, Success, Retrying, or Failed. |
| HTTP Status Code | The response code from your server (e.g. 200, 500). |
| Response Body | First 1,000 characters of your server's response. |
| Attempt Count | How many delivery attempts have been made. |
| Next Retry | When the next retry is scheduled (if retrying). |
| Created / Last Attempt | Timestamps for tracking. |
💡 Tips for Webhook Consumers
- Return 2xx quickly — Process webhook data asynchronously. Return a 200 immediately and queue the work in your own system.
- Use the Delivery ID — The
X-Sayify-Delivery-Idheader is unique per delivery attempt. Use it for idempotency to avoid processing duplicates. - Verify signatures — Always check
X-Sayify-Signaturebefore acting on a payload. - Handle both events — Subscribe to
response.startedfor real-time engagement tracking andresponse.submittedfor the full data. - Log everything — Store raw payloads for debugging. Webhook issues are much easier to diagnose with full request logs.
- Use HTTPS — Sayify sends payloads containing respondent data. Always use HTTPS endpoints to protect this data in transit.
🎓 What's Next?
- Zapier Integration — Connect Sayify to 5,000+ apps with flattened payload format.
- Integrations — Overview of all integration options.
- API Reference — Full REST API documentation.
- Inbox — Review responses in the dashboard.
- Key Concepts — Review all platform building blocks.