The Conversation Object
Every conversation carries a consistent set of fields:| Field | Type | Description |
|---|---|---|
id | string | Unique conversation identifier |
end_user_id | string | The resolved identity of the user in this session |
channel | enum | api, sms, voice, or email |
status | enum | Current lifecycle status (see below) |
session_type | enum | live, test, or simulation |
assigned_agent_id | string | The agent currently handling this conversation |
pinned_revision_id | string | The agent revision pinned at conversation creation |
created_at | timestamp | When the conversation was opened |
updated_at | timestamp | When the conversation last received activity |
Session Types
Feather supports three session types that let you test and simulate behavior without affecting production data or metrics:live
A real conversation with a real end user. Counts toward usage, triggers webhooks, and appears in production analytics.
test
A developer-initiated session for integration testing. Runs the full agent stack but is excluded from production dashboards.
simulation
A scripted replay used for evaluating agent revisions or policies before publishing. Simulation sessions are read-only and replay a fixed set of turns.
Status Lifecycle
A conversation moves through a defined set of statuses over its lifetime:| Status | Meaning |
|---|---|
active | The agent is processing turns normally. |
waiting_for_human | The agent has handed off to a human agent queue. The AI will not respond until a human returns control. |
awaiting_approval | A policy has paused the conversation pending a human reviewer’s decision on a specific tool call or action. |
closed | The session has ended. No further turns can be submitted. |
A conversation in
waiting_for_human or awaiting_approval still accepts incoming user messages — they are queued and will be delivered once the status returns to active.Turns
Each exchange within a conversation is called a turn. A turn represents one complete round-trip: the user sends a message, and the agent produces a reply. Turns are appended to the conversation’sturns array and are immutable once recorded.
Each turn contains:
role
role
Either
user (the end user’s message) or assistant (the agent’s reply). System-generated messages (e.g. handoff notices) carry the system role.content
content
The text of the message. For voice channels, this is the transcript. For email, this is the plain-text body.
tool_calls
tool_calls
An array of tool invocations the agent made during this turn. Each entry includes the tool name, input arguments, and the tool’s response. This is present only on
assistant turns where tools were used.evidence
evidence
An array of knowledge base chunks retrieved and used to generate this turn’s response. Each entry includes the
chunk_id, kb_id, similarity score, and the text snippet. Use this to audit retrieval quality or build citation UI.Channels
All four Feather channels map to the same conversation model. The channel determines how messages arrive and how responses are delivered — the underlying session logic is identical.API
Submit turns via
POST /v1/conversations/{id}/turns. Responses are returned synchronously or streamed via SSE. Ideal for web chat, mobile apps, and custom interfaces.SMS
Feather receives inbound SMS via your configured phone number and delivers responses as outbound SMS. Each phone number maps to a persistent conversation per end user.
Voice
Inbound and outbound calls are transcribed in real time. Feather generates spoken responses via TTS. Voice conversations support mid-call
transfer_call to human agents.Inbound emails create or continue a conversation thread. Feather replies from your configured sending domain. Email conversations support rich threading with full history context.
End Users and Identity Resolution
Every conversation is associated with anend_user_id. Feather resolves user identity from channel-specific signals — a phone number for SMS, a caller ID for voice, an email address for email — using the identity resolution endpoint:
end_user_id and any stored profile data. If no match is found, Feather creates a new end user record automatically and returns the new ID.
This means that a user who contacts you via SMS and later via email can be linked into a single identity — giving your agents access to full cross-channel conversation history.
Human-in-the-Loop States
Two conversation statuses represent human-in-the-loop (HITL) scenarios:waiting_for_human
This status is set when an agent invokes the transfer_call platform tool or when a workflow reaches a handoff node. The conversation is routed to a human agent queue. Your human agents respond via the Feather dashboard or the POST /v1/conversations/{id}/human-turns endpoint. When the human returns control, status reverts to active and the AI agent resumes.
awaiting_approval
This status is set when a policy with action require_approval is triggered before a tool call. The conversation pauses and an approval request is created. A reviewer approves or rejects via POST /v1/conversations/{id}/approvals/{approval_id}/resolve. On approval, the tool call proceeds and status returns to active. On rejection, the turn is blocked and a safe message is returned to the user.
Next Steps
Run a Conversation
A hands-on walkthrough of creating a conversation, submitting turns, and inspecting the response including tool calls and evidence.
Conversations API Reference
Full reference for conversation, turn, identity, and approval endpoints.