Synthflow · AsyncAPI Specification

Synthflow Webhooks

Version

View Spec View on GitHub VoiceVoice AgentsNo-CodeTelephonyPhoneOutboundInboundCRMWebhookCustom ActionsHIPAASOC 2MCPAgent SkillsConversational AISIPSimulationsKnowledge BaseAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-13'
method: searched
source: https://docs.synthflow.ai/webhooks
docs:
  webhooks: https://docs.synthflow.ai/webhooks
  security: https://docs.synthflow.ai/security#webhook-security
  logs: https://docs.synthflow.ai/logs
spec_type: none
asyncapi_published: false
description: >-
  Synthflow publishes no AsyncAPI document, but it does document a real, signed,
  observable webhook surface with two event types, an HMAC signature scheme and a
  first-class delivery-log API. This artifact captures that catalog. The webhook payload
  is not described in the OpenAPI — the Platform API models only the delivery LOGS
  (ListWebhookLogs, GetWebhookLogDetail) — so this is the only machine-readable record of
  the event contract in the repo.

transport: https
direction: outbound
delivery: 'HTTP POST to a customer-controlled URL'

security:
  signature:
    algorithm: HMAC-SHA256
    header: HTTP_SYNTHFLOW_SIGNATURE
    signed_payload: call_id
    encoding: base64
    secret_management: 'Admin -> Workspace Settings -> Security -> Webhooks'
    applies_to: [post-call, inbound]
    verification_guidance: >-
      Synthflow publishes a Python reference implementation and explicitly instructs
      constant-time comparison (hmac.compare_digest) to avoid timing attacks.
    note: >-
      The signature covers the call_id only, not the full request body. A verifier
      therefore proves the sender knows the shared secret for that call_id, but does not
      get body-integrity coverage from the signature itself.

events:
  - name: post-call
    summary: Fires after a call ends.
    configured_by:
      field: external_webhook_url
      where: 'the Make a call request body'
      operations: [voice-call]
      also_settable_on_agent: true
    signed: true
    payload_highlights:
      - transcript
      - call status
      - end call reason
      - executed actions
      - post-call analytics (LLM-judge scoring)
      - collected variables
      - recording availability
    enumerations:
      call_status: [pending, ringing, in-progress, completed, no-answer, busy, failed, canceled, user-canceled, hangup_on_voicemail, left_voicemail, spam, paused, registered]
      end_call_reason: [voicemail, voicemail_message_left, human_goodbye, agent_goodbye, human_pick_up_cut_off, max_duration, custom_end_call, user_canceled, undefined]
    analytics_fields:
      scored: [persona, style, steps, no_repetition, objections, objection_not_defined, knowledge, goal, appointment, user_sentiment, agent_sentiment, call_completion, answered_by_human, opted_in, no_opt_out, call_summary]
      aggregate: [judge_found_partial_or_error, judge_found_full_error, all_feedback]
      value_domains:
        boolean_or_na: 'true | false | not_applicable | null'
        graded: 'true | partial | false'
    privacy: >-
      Agent-level PII redaction (redact_pii) strips credit card numbers/expiry/CVV, SSNs,
      names, emails, phone numbers and physical addresses from post-call webhook payloads
      before delivery. Redaction is one-way and applies to new calls only.
  - name: inbound
    summary: Fires within roughly 10 seconds of an inbound call starting.
    configured_by:
      field: inbound_call_webhook_url
      where: 'the agent document'
      operations: [create-assistant, update-assistant]
    signed: true
    purpose:
      - assign or reroute the agent that will take the call
      - inject variables and metadata into the conversation
    note: >-
      This is a request/response webhook, not fire-and-forget — the customer's response
      steers call routing, which makes latency part of the contract.

observability:
  delivery_logs:
    docs: https://docs.synthflow.ai/logs
    api:
      list: ListWebhookLogs
      detail: GetWebhookLogDetail
      spec: openapi/_original/synthflow-openapi.json
    mcp_tools: [list_webhook_logs, get_webhook_log_detail]
    note: >-
      Both the request and the response for a single delivery are retrievable, over REST
      and over MCP. That is stronger delivery observability than most webhook surfaces in
      the catalog expose.

gaps:
  - 'No AsyncAPI or JSON Schema document is published for either event payload.'
  - 'No documented retry policy, backoff schedule or dead-letter behaviour for failed deliveries.'
  - 'The signature covers call_id rather than the request body, so it does not provide body integrity.'
  - 'The webhook payload shape is documented in prose and tables on the docs page only; it does not appear in the OpenAPI as a `webhooks` block, which OpenAPI 3.1 would allow.'

x-evidence:
  fetched: '2026-08-13'
  probes:
    - {url: 'https://docs.synthflow.ai/webhooks', status: 200}
    - {url: 'https://docs.synthflow.ai/webhooks.md', status: 200}
    - {url: 'https://docs.synthflow.ai/security.md', status: 200}
    - {url: 'https://docs.synthflow.ai/asyncapi.yaml', status: 404}