Handoff reasons
Overview
When the AI Agent hands a conversation to a human agent through a Handoff, it records why. Use these reasons to find handoffs that you can reduce, such as a failing Tool or a gap in your Knowledge.
Each reason has two fields:
reason_code: one value from a fixed list of ten, ornullwhen no code was recorded. Use it to count, filter and compare handoffs.reasoning: an explanation, based on the conversation, the Tool results or the configuration of your AI Agent. Use it to understand a single handoff. It isnullwhen no text was recorded.
The Data Export API returns both fields in the handoffs array. The get_conversation MCP tool returns both fields, and get_available_filters offers the HANDOFFREASON filter. See Where the fields appear.
Limitations
Handoff reasons have the following constraints:
- The AI Agent records reason codes from 2026-10-07. Most earlier handoffs have a
nullreason code. - Some AI Agents do not choose a cause during a conversation. Their handoffs outside Playbooks record
unclassified. These handoffs do not get a cause later. - The Data Export
handoffsarray includes only the handoffs that the AI Agent starts. The array can be empty for an escalated conversation. Useis_escalatedto know whether a conversation was escalated. - The AI Agent writes the
reasoningtext in English. When it chooses one of the eight causes, the system asks for one or two sentences. Other text can be longer. Older text can be in the language of the conversation. Text that you set on a Playbook step can be in any language.
Use cases
Reason codes show where to start when you want fewer Handoffs.
- Fix failing Tools:
tool_failedhandoffs can point to a Tool or an integration that failed or timed out. - Review Tool access:
tool_unavailablehandoffs show tasks that need a Tool the AI Agent does not have or cannot use. - Fill Knowledge gaps:
knowledge_unavailablehandoffs show information that the AI Agent did not have. Check whether your Knowledge needs more content. - Review your routing:
handoff_configuredhandoffs show requests that your configuration sends to a human agent. Check whether the AI Agent could handle those requests. - Track requests for a person:
end_user_requestedhandoffs show where the end user’s request for a human agent caused the handoff.
Reason codes
The first eight codes are causes. When the AI Agent chooses a cause for a Handoff during a conversation, it records the first cause in the table that applies. Only the system records system_failed and unclassified. A Playbook handoff step gets its reason in a different way, and its rules can differ from this table. See How the reason is assigned.
A handoff has a null reason code in these cases:
- The handoff happened before 2026-10-07, when most handoffs had no recorded reason code.
- The AI Agent did not give a valid reason code.
- The AI Agent had to hand off, but no Handoff was available, so it sent an error message instead.
A handoff with a null reason code matches no IS value of the HANDOFFREASON filter. A count by reason code does not include these handoffs.
How the reason is assigned
A Handoff gets its reason at one of two moments, depending on how it was triggered.
- During a conversation. When the AI Agent decides to hand off, it records the
reason_codeand thereasoning. When the AI Agent chooses one of the eight causes, the system is instructed not to include personal data. Personal data includes names, addresses, account numbers and card numbers. - Playbook handoff steps. Each handoff step in a Playbook can hold its own reason, and handoffs from the step record it.
- You can set a step’s
reason_codeandreasoningwith theedit_agent_behaviorMCP tool or the Playbooks API. Set them on therunstep that targets the Handoff. An MCP edit goes live when you promote its change set. - The
reason_codemust be one of the eight causes. Thereasoningneeds areason_codeand has a maximum of 300 characters. - Later saves keep the values that you set, including saves in the dashboard, which does not show these fields. To let the system assign the reason instead, set
reason_codetonull. - After you save a Playbook, the system assigns a reason to each handoff step that has none. It bases the reason on the steps that lead to the handoff step. Until then, or if that fails, handoffs from the step record
unclassified. The system does not replace a reason that you set. - To read the reasons, use
list_entitiesfor one Playbook or the Playbooks API. These reads show the reasons that you set, not the reasons that the system assigns. A Snapshot API export and import also keep the reasons that you set.
- You can set a step’s
Where the fields appear
Each location shows the Handoff reason fields in its own format.
Handoff attempts and escalations
A handoff reason belongs to one attempt of a Handoff. The AI Agent records the reason when it starts the attempt, even if the attempt fails. So a reason does not show that the end user reached a human agent.
- In the Data Export, each
handoffsentry is the latest attempt for one handoff target. Itsoutcome_statusgives the result, for examplesucceededorfailed. - With
IS, theHANDOFFREASONfilter also matches conversations where the attempt with that reason failed. - To find escalated conversations, use
is_escalatedin the Data Export or theHANDOFFfilter in MCP. They show whether the conversation was escalated, not which handoff attempts the AI Agent made.