Complete a warm transfer
Makes the handoff final: the caller stays in the conference with the human. No carrier leg is touched (the AI already left the line when the transfer started) and the call row is closed by the carrier when the caller eventually hangs up.
Requires a transfer started with POST /api/calls/{callId}/transfer; otherwise 400.
Side effects. Sets the call’s outcome to escalated_to_human unless post-call analysis already wrote one, and sends a call.escalated trigger to Zapier subscribers with transferredTo set to the destination number and no escalatedBy key (absent means this admin path). The transfer fields are kept. Writes an audit entry.
This is no longer the only producer of escalated_to_human: since 2026-09-15 the agent handing the call to a person during the call records the same outcome and fires the same trigger, with escalatedBy: "agent" and transferredTo: null.
Idempotency. Safe to retry: repeating it re-applies the same outcome (never overwriting an existing one).
Access
- Required scope:
full. Signed-in users need the admin or owner role. - Rate limit: General API — 120 (Starter), 200 (Growth), 300 (Business) or 600 (Enterprise) requests/min per workspace. The 20/min outbound limit applies only to starting the transfer. See Rate limits.
- Plan: Available on every plan.
Authentication
Workspace API key: jl_ followed by 64 lowercase hex characters, created by the workspace owner in the
dashboard (Settings → API Keys) and sent as Authorization: Bearer jl_.... The plaintext is shown once,
at creation; Jelliu stores only a SHA-256 hash. A workspace can hold up to 25 active keys.
Operations restricted to admins or owners reject keys without the full scope with 403, and say so in
their description. No key, whatever its scope, can mint or revoke API keys or rotate a webhook secret —
that requires a signed-in owner session. A revoked key stops authenticating within about 10 seconds.
See Authentication.
Path parameters
The transferred call’s id. Must be a UUID (400 Invalid call ID otherwise).
Response
Transfer completed. Note this body has no data wrapper.
Always true.

