How a conversation is classified
You don’t set
channel or surface directly — Feather assigns them based on how the conversation is created. Creating one over the API (POST /v1/conversations) always yields a chat conversation on the direct_api surface.
Where each channel is created
Each channel has its own entry point, but they all produce the same conversation object with the same turns, transcript, analytics, and HITL behavior.Chat
Created with
POST /v1/conversations. Powers your own app (surface direct_api) and the embeddable webchat widget (surface webchat_widget).SMS
Outbound via
POST /v1/sms/send; inbound arrives on your Twilio number. Each number maps to a conversation per end user.Voice
Created by inbound calls to a bound number or by
POST /v1/voice/outbound — over the phone (SIP) or in the browser (web).Inbound mail creates or continues a thread on the
mailbox surface; replies go out from your connected mailbox.Identity across channels
Every conversation resolves to anend_user_id. How that happens depends on what you provide at creation:
end_user_id— reference a known end user directly.org_external_end_user_id— pass your own stable identifier (a customer ID, or a persisted anonymous browser token). Feather get-or-creates an end user and, when possible, bridges it to the same person’s existing email or phone identity.- Nothing — Feather resolves the authenticated caller as the end user.
Thread keys
Within a channel,external_id distinguishes concurrent threads for the same user. Reusing a value resumes that thread; a new value opens another. external_id is unique per organization, which also makes conversation creation idempotent under retries.
For anonymous webchat visitors, send a stable per-visitor token in
org_external_end_user_id. A new value on every page load creates a new
identity and loses history and memory.Next steps
Conversations
The full conversation object, status lifecycle, and turn model.
Embed the webchat widget
Drop a Feather assistant onto your website with the embeddable widget.