Skip to content

Documentation / Guides / Blind transfer

Perform a blind transfer

The consumer decides when and where to transfer. VAANI coordinates one bounded provider-neutral handoff and records the strongest disposition it can prove.

Configure named routes

transfer_policy = TransferPolicy(
    enabled=True,
    allowed_route_ids=("support-en", "support-hi"),
    adapter_id="deployment-transfer",
)

Route IDs are safe, provider-neutral tokens. Do not use a phone number, SIP URI, credential, or vendor payload as a route ID. The deployment-owned transfer adapter maps the token to its protected destination.

Request from a tool

async def transfer_handler(context, arguments):
    record = await context.request_transfer(
        TransferRequest(
            route_id=arguments["route"],
            reason="caller requested a specialist",
        )
    )
    return {"disposition": record.disposition.value}

The tool's arguments schema should enumerate or otherwise validate approved route tokens. Authorization remains consumer-owned.

Understand dispositions

Disposition Proven fact
FAILED handoff failed
TIMED_OUT no permitted terminal evidence arrived by the deadline
ACCEPTED provider accepted the handoff; completion is not proven
COMPLETED distinct typed completion evidence exists

Do not display ACCEPTED as a completed transfer. An accepted/completed transfer closes the VAANI conversation without an independent participant hangup.

VAANI 1.0 models blind transfer only—not warm transfer, consultation, conference, or return-path behavior.

Next: production security or error taxonomy.