Skip to main content
When a voice agent escalates a call to a human, that used to be permanent: the call stayed with a person until it ended. The handback endpoint is the reverse trip — once the human resolves whatever needed their judgment, send the call back to the AI agent. Use it when a call needs a person only briefly: approve a refund, verify an identity, settle an exception, then let the AI finish the wrap-up — read back a confirmation, collect a survey answer, or offer the next action.

Prerequisites

  • A live, non-terminal call that is currently answered by a human agent (one that was escalated from the AI earlier, or answered by a person directly).
  • The call’s conference_id (the escalation creates the conference the human and caller now share).
  • The AI agent’s id — optional: if omitted, the handback re-invites the same AI agent that originally escalated, read from the call’s handoff record. Supply ai_agent_id only when a call was human-answered from the start, or when you want a different agent to resume.

Hand the call back

Send the human agent’s own conference leg as human_participant_call_sid so it disconnects once the AI rejoins:

Request fields

POST /api/v1/voice/calls/{call_id}/handback accepts: The response is 202 Accepted:

Node SDK

The endpoint is one POST on any HTTP client. With the Node SDK(the raw request helper works for any route, including ones not yet wrapped as named methods):

What the AI agent resumes with

The AI agent does not start over. It rejoins the call carrying:
  • everything it captured before escalating (collected details like an order number or verified identity), and
  • the full merged conversation — the bot leg plus the human leg — so nothing the caller told the human has to be repeated.
A call can move between AI and human more than once. Each handback builds on the original context, and handback_count in the persisted record tracks how many times the call has returned.

The human never leaves the caller alone

The ordering is deliberate: the AI agent is invited back into the conference first, and the human’s leg is only disconnected after the AI confirms it answered. If the AI does not answer, the human stays on the line and the response reports bot_answered: false, human_dropped: false — the caller is never left without anyone on the call. Omit human_participant_call_sid for a monitor-only re-invite: the AI rejoins but no leg is disconnected, so a human supervisor can keep listening.

Every handback is recorded

Each handback appends a voice.handback.initiated entry to your audit log carrying the reason, the initiating user, the conference and agent ids, the answer and drop outcomes, and the round-trip counter — the same way the original AI-to-human escalation is recorded. There is no dedicated handback webhook event; subscribe to Audit log events if you want the action pushed to a sink.

Error matrix

404 responses with PARTICIPANT_NOT_IN_CONFERENCE leave no side effects on the call: no re-invite, no persisted record, no audit entry.

Edge cases

  • Double handback counts up. A call can bounce between AI and human any number of times. Every successful handback appends one round-trip to handback_count, starting at 1.
  • Racing a hangup. If the caller hangs up after the request checks pass but before the handback completes, the response is still 202 — the call was live at lookup time. A repeat request once the call has ended fails 409 (CALL_TERMINAL) with the final call state in details.status.
  • Monitor-only re-invite. With human_participant_call_sid omitted, the AI rejoins but nothing is dropped — a supervisor can keep listening. The response reports human_dropped: false.
  • AI fails to answer. When the re-invited agent does not confirm within the answer window, the human leg is retained and the response carries bot_answered: false, human_dropped: false. Retry the handback — the round-trip counter and audit are written even for a failed answer.
  • Empty reason is rejected. A blank reason fails the same 422 path as a malformed conference_id.

Cross-references