Transfer to a human

Hand a live call to a person, and the destination rules Skysay enforces before it will.

transfer_to_human is a built-in tool your AI agent can invoke mid-call to hand the caller to a person. You enable it on the agent and give it one destination number; the agent proposes when to use it. The caller must approve the read-back before the destination is dialed. See Confirming business actions.

Eleven Realtime cannot use Transfer to human yet. Choose another conversation engine for live human transfer. An AI agent configured with transfer_to_human or cancel_transfer cannot be switched to Eleven Realtime, published on it or started on it. An explicitly configured callback request remains available; it does not connect a live transfer.

With Eleven Realtime, while an action runs, the agent cannot hear or answer the caller. Speech during that wait is absent from the transcript; the caller must repeat it after the action finishes. Speaking cannot stop an action that is already running. Interruptions work during normal speech.

Configure the destination

{
  "type": "builtin",
  "name": "transfer_to_human",
  "phone_number": "+12025550100"
}

phone_number is required whenever the tool is enabled, and must be full E.164 — a leading +, then the country code. A blank, partial, or non-dialable number is rejected when you create or update the agent, so a misconfigured transfer surfaces at save time instead of failing in front of a caller.

Note that a bare national number is not accepted even when it looks unambiguous: 2025550100 is not the same request as +12025550100, and guessing a country code on your behalf is how a call ends up dialing a real number in a different country.

When the agent decides to transfer

There is no fixed rule, hour, or condition that triggers a transfer. The agent calls the tool from its instructions and the conversation so far. By default Skysay tells it to ask first:

  • It transfers when the caller asks for a person ("Can I speak to someone?"), straight away, without asking them to confirm.
  • Otherwise it may offer a transfer ("Would you like me to connect you to a colleague?") and transfers only once the caller says yes. If something is beyond what the agent can do, it says so and offers the transfer instead of guessing.
  • If the caller declines, the agent keeps helping, or offers to save a callback.

That default is a starting point, not a lock. The way you steer transfers is the agent's own prompt: if you want a transfer at once for emergencies, only for billing disputes, or only after the caller asks twice, say so in the instructions.

The caller's request is the confirmation. When the caller asks to speak to someone, or says yes after the agent offers to connect them, the agent transfers straight away. It does not read the destination back or ask a second yes-or-no question.

The tool takes an optional reason, which the agent supplies to describe why it handed the call over.

If the caller changes their mind

The agent stays on the line while the person's phone rings, and the caller can still stop the transfer. Enabling transfer_to_human also gives the agent a second built-in, cancel_transfer (shown as Cancel a transfer in progress, added with the transfer). When the caller says "no, don't transfer me" during the ring, the agent calls it: the ringing phone stops before anyone answers, nobody is connected, and the agent tells the caller the transfer is off only after it has really stopped. The conversation then carries on with the agent.

Only the caller can call it off: Skysay stops a transfer only when the caller has started speaking since it began. If the agent tries to cancel with the caller silent, or because the caller repeated their request, the phone keeps ringing and the agent tells the caller it is still trying.

Once the person has answered and the two of them are connected, a transfer can no longer be cancelled.

Each call tries to reach a person once. After a transfer that was called off, the agent cannot transfer again on that call; it offers to save a callback instead.

Transfers are policy-gated

Every transfer passes your workspace's outbound policy gate, with the destination's country resolved from the number itself. A blocked destination is refused even when the agent asks for it. See Policy & outbound.

In a workflow

An AI agent with a workflow does not decide on its own: an Action using transfer_to_human reads back this same destination, waits for an explicit yes, and then permits one dial attempt per call through the same policy gate. See Transfer steps.

What the tool reports back

A connecting result means the dial was requested; it does not mean a person answered. Treat it as "the handoff was started". In a workflow, the Action first returns the pending action and its read-back, and after the caller's yes the workflow waits for the actual dial outcome. Read call evidence for what actually happened on the call.

Skysay records how each call's transfer ended:

OutcomeMeaning
answeredThe person picked up and the caller was connected to them.
no_answer, busy, rejectedThe person did not pick up, the line was busy, or the call was declined. The caller stays with the agent.
failedThe transfer could not be placed. The caller stays with the agent.
caller_cancelledThe caller changed their mind while it rang, and the agent stopped it. Nobody was connected.
caller_hangupThe caller hung up before anyone was connected.
outcome_unknownThe call ended before the outcome was reported.

Only failed, rejected, busy, no_answer and outcome_unknown count as a transfer that went wrong in why calls fail; a caller who withdrew the transfer or hung up first is not a failed handoff.