Daily · AsyncAPI Specification

Review

Version

View Spec View on GitHub RealtimeWebRTCVideoAudioSDKVoice AIRecordingTranscriptionAsyncAPIWebhooksEvents

AsyncAPI Specification

review.yml Raw ↑
aid: daily-co:asyncapi-review
name: Daily.co AsyncAPI Review
kind: review
date: '2026-05-29'
reviewer: API Evangelist
subject: Daily.co public WebSocket / event-driven API surface
verdict: no-public-websocket-api
summary: >-
  Daily.co does not expose a documented, public WebSocket endpoint that
  developers can connect to directly. Its event-driven surface is delivered
  exclusively through (1) HTTP webhooks (server-to-server POST callbacks) and
  (2) SDK-side event listeners (daily-js, daily-react, react-native-daily-js,
  iOS/Android/Flutter SDKs) that abstract an internal WebRTC + WebSocket
  transport developers are not expected to address directly. Because there is
  no documented wss:// endpoint, no documented WebSocket message schema, and no
  documented WebSocket auth / subprotocol contract, an AsyncAPI 2.6 spec that
  faithfully describes a Daily-hosted channel cannot be produced without
  fabrication. An AsyncAPI 2.6 spec was therefore NOT generated.
findings:
  - id: webhooks-only
    label: Realtime delivery is HTTP webhooks
    detail: >-
      Daily delivers room/meeting/recording/transcript/streaming/dial-in/
      dial-out/call-transfer/batch-processor events as HTTP POST callbacks to a
      developer-provided URL, not over a WebSocket channel. Webhook delivery is
      acknowledged via 2xx status. This is a request/response webhook contract,
      better described by an OpenAPI callback or AsyncAPI HTTP binding, not a
      WebSocket binding.
    documented_events:
      - meeting.started
      - meeting.ended
      - participant.joined
      - participant.left
      - waiting-participant.joined
      - waiting-participant.left
      - recording.started
      - recording.ready-to-download
      - recording.error
      - transcript.started
      - transcript.ready-to-download
      - transcript.error
      - streaming.started
      - streaming.updated
      - streaming.ended
      - streaming.error
      - batch-processor.job-finished
      - batch-processor.error
      - dialout.connected
      - dialout.answered
      - dialout.stopped
      - dialout.warning
      - dialout.error
      - dialin.ready
      - dialin.connected
      - dialin.stopped
      - dialin.warning
      - dialin.error
      - calltransfer.triggered
      - calltransfer.initiated
      - calltransfer.answered
      - calltransfer.completed
  - id: sdk-event-listeners
    label: Client realtime events are SDK-only
    detail: >-
      The daily-js client exposes events through an EventEmitter interface
      using on(), once(), and off(). These events (e.g., joined-meeting,
      participant-joined, track-started, app-message, transcription-message,
      network-quality-change) are dispatched by the SDK after it negotiates
      a session with Daily's signaling and media infrastructure. The
      underlying transport is not specified as a public WebSocket interface
      and is not documented with a connectable URL or message schema.
  - id: webrtc-transport
    label: Media/signaling transport is WebRTC, not a public WS API
    detail: >-
      Daily and Pipecat Cloud (Daily Bots) describe their realtime transport
      as WebRTC. Pipecat Cloud notes "Built-in WebRTC" transport and directs
      developers to start sessions via REST or the Python SDK. No wss://
      endpoint is published for external clients.
  - id: diagnostic-ws-only
    label: WebSocket references are diagnostic, not endpoint contracts
    detail: >-
      The only WebSocket-named symbols in the public reference are SDK
      diagnostic methods such as testWebsocketConnectivity() and
      abortTestWebsocketConnectivity(). These probe connectivity to Daily's
      infrastructure; they do not constitute a documented developer-facing
      WebSocket API.
pages_checked:
  - url: https://docs.daily.co
    result: No public WebSocket endpoint mentioned. References WebRTC vs.
      WebSockets only as a tutorial topic.
  - url: https://docs.daily.co/reference
    result: WebSocket references are limited to SDK diagnostic helpers
      (testWebsocketConnectivity / abortTestWebsocketConnectivity). No wss://
      endpoints documented.
  - url: https://docs.daily.co/reference/rest-api/webhooks
    result: Confirms event delivery is HTTP POST webhooks. 34 documented event
      types across meeting, participant, recording, transcription, streaming,
      batch-processor, dial-in, dial-out, and call-transfer categories.
  - url: https://docs.daily.co/reference/daily-js/events
    result: Daily-JS event surface is exposed via EventEmitter (on/once/off).
      No wss:// URL or WebSocket message schema documented.
  - url: https://docs.pipecat.daily.co/
    result: Redirects (301) to https://docs.pipecat.ai/deployment/pipecat-cloud/introduction.
  - url: https://docs.pipecat.ai/deployment/pipecat-cloud/introduction
    result: Pipecat Cloud uses Built-in WebRTC transport. Sessions started via
      REST or Python SDK. No public wss:// endpoint documented.
  - url: https://docs.daily.co/guides/products/live-streaming
    result: HTTP 404 at the time of review.
  - url: https://docs.daily.co/reference/rtvi
    result: HTTP 404 at the time of review.
recommendation: >-
  Document Daily's event-driven surface as an OpenAPI callbacks spec (webhook
  receiver contract) rather than AsyncAPI. If Daily later publishes a public
  wss:// endpoint (for example for transcript streaming or Pipecat Cloud
  realtime control), revisit and produce an AsyncAPI 2.6 spec at that time.
artifacts_produced:
  spec: null
  review: asyncapi/review.yml