Skip to main content
Not every decision should be left to an AI. Feather’s Human-in-the-Loop (HITL) system lets you define exactly when a human needs to be in the conversation — whether that’s approving a high-stakes action before the assistant executes it, or handing the entire thread to a live support agent. Both modes keep the customer experience coherent: the user sees consistent messages and the operator has full context from the start.

Two HITL modes

Approvals

The assistant pauses mid-conversation before executing a tool call or workflow action. A human operator reviews the pending action, then approves or denies it. The assistant automatically resumes with the decision and continues the conversation.

Handoffs

The assistant transfers the entire conversation to a human operator. The operator sends messages that are relayed directly to the end user. When the issue is resolved, the operator closes the handoff and the session ends gracefully.

Handling approvals

When a conversation reaches an action that requires sign-off, the assistant enters awaiting_approval status and waits — it will not proceed until a decision is recorded.
1

List pending approval requests

Poll this endpoint from your operator dashboard or webhook handler to surface requests that need attention.
The response lists approval summaries including the subject_ref, approver_role, and the suspend_message shown to the user.
2

Fetch full approval detail

Retrieve the complete record for a specific approval — including the action payload the assistant wants to execute.
ApprovalRequestDetail fields:
3

Submit your decision

Approve or deny the pending action. Include a note when denying so the assistant can explain the outcome to the user.
Once the decision is submitted, the conversation automatically resumes. If approved, the assistant executes the action. If denied, the assistant receives the denial note and responds to the user accordingly.

Handling handoffs

When an assistant triggers a handoff, the conversation transitions to waiting_for_human status. The assistant is no longer generating responses — a human operator takes over completely.
1

List pending handoffs

2

Review the handoff context

Fetch the full handoff record to understand why the assistant escalated and what the customer’s situation is before you write your first message.
The packet field contains everything the assistant prepared for the handoff:
3

Relay a message to the user

Send messages as the human operator. They appear in the customer’s conversation thread immediately.
You can send as many messages as needed. The customer replies are visible by polling GET /v1/conversations/{id}/messages.
4

Resolve the handoff

When the issue is resolved, close the handoff. The conversation is marked HANDOFF_RESOLVED and the session ends.
Poll GET /v1/conversations/{id}/messages?since_seq={n} to receive the end user’s replies in real time during an active handoff. Pass the sequence number of the last message you’ve read as since_seq to receive only new messages.

Custom approval messages

While a conversation is paused waiting for approval, the end user sees a holding message. You can customize both the initial holding message and the follow-up patience message to match your brand voice.

Configuring HITL in workflows

Approval and handoff behaviors are configured as nodes in your assistant’s workflow graph. Here’s how both node types look in a workflow definition:
An Approval Node’s condition is a deterministic expression: when it evaluates to false the node is a pass-through and no approval is requested. When it’s true, the runtime suspends and emits an approval request. On resume, on_approve and on_deny each name the next node to route to for that decision — a timeout is recorded as a deny, so it follows the on_deny path.