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

  1. Open the sidebar and go to Webhooks & Integrations.
  2. Click the + Create Webhook button in the top-right corner.
  3. 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.
  4. 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-Id header is unique per delivery attempt. Use it for idempotency to avoid processing duplicates.
  • Verify signatures — Always check X-Sayify-Signature before acting on a payload.
  • Handle both events — Subscribe to response.started for real-time engagement tracking and response.submitted for 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?

Was this page helpful?
Report an issue →