ThunderPhone 2.0 is live.Self-serve, from 2¢/min.Read the announcement

Contact centers

Contact centers

Send calls from Amazon Connect, Five9, Genesys Cloud, Talkdesk, Twilio, Microsoft Dynamics 365, NICE CXone or Zoom Contact Center to a ThunderPhone agent over SIP, and get them back with the agent

A ThunderPhone agent can answer calls inside your contact center's call flow. Your platform sends the call to the agent's SIP address with SIP headers that carry its own call id and anything else it knows about the caller. When the caller needs a person, the agent hands the call back with a hand-off: a summary of what the caller needs, a short intent label and an id your flow can look up.

Platforms

PlatformHow the call arrivesCall-id headerHow it comes backHow the context gets back
Amazon ConnectExternal voice transfer connector; IP allowlistX-Amzn-ConnectContactIdReturn: the agent hangs up and the flow resumesA Lambda calls the hand-off lookup
Five9AI Agent Connect, set up by Five9, to a dial-in number; IP allowlistX-CallIDReturn: the agent hangs up with routing headers on the BYEX-Route* and X-CustomMetaData headers into IVR call variables
Genesys CloudBYOC Cloud trunk; digestx-inin-cnvREFER, accepted by Take Back and TransferHex UUI inside the transfer address, then a data action
TalkdeskConnect to Autopilot Voice; IP allowlistX-Talkdesk-Interaction-IdREFER to Talkdesk's escalation addressHex UUI inside the transfer address, then Execute Action
Twilio<Dial><Sip>; digestX-Call-ID, which you addREFER to your referUrl handlerHeaders inside the transfer address (ReferTransferTarget)
Microsoft Dynamics 365Transfer to a phone number, through your SBC; digestX-Call-ID, which you addReturn, then your SBC routes the caller backHTTP Request node calls the hand-off lookup
NICE CXoneStudio Placecall with Sipputheader, to a dial-in number; IP allowlistX-Call-ID, which you addReturn: the agent hangs up (confirm with NICE how the script takes the caller back)REST API action calls the hand-off lookup
Zoom Contact CenterBot widget on a trunk Zoom builds, to a dial-in number; IP allowlist with SRTPX-ZOOM-Call-SidREFER to Zoom's human-agent addressHTTP Call widget calls the hand-off lookup

How it works

  1. Create a SIP endpoint for the agent. Platforms that can answer a password challenge use the endpoint's username and password. Platforms that identify themselves only by their source addresses use an endpoint with auth set to ip_allowlist; see Platforms that authenticate by source IP. Platforms that dial a phone number rather than a SIP address reach the endpoint through its dial-in numbers.
  2. Send calls with context. The platform dials the endpoint's sip_uri or a dial-in number. Every X- header and User-to-User it sends becomes a {{sip_…}} call variable the prompt can use, and its call-id header is stored as the call's external_call_id. See Pass call context in SIP headers.
  3. Add one transfer number that hands the call back, either a SIP address on your platform (the agent sends a REFER) or a return (the agent hangs up and your flow carries on). Its headers can carry {{handoff_summary}}, {{handoff_intent}} and {{handoff_id}}; see Pass context to your contact center.
  4. Read the hand-off where your platform puts it, or look it up by your platform's call id.

Add the transfer number

SIP addresses, returns and their headers are set with the Agents API. A write replaces the whole list, so include the agent's other transfer numbers, then deploy:

curl -X PATCH https://api.thunderphone.com/v1/agents/12 \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"transfer_destinations": [{"name": "Contact center", "action": "return"}]}'
 
curl -X POST https://api.thunderphone.com/v1/agents/12/deploy \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

Then tell the agent when to use it, by name, in its prompt: "When the caller asks for a person, or you can't resolve the request, transfer to Contact center."

Look up the hand-off

Your flow can fetch the hand-off with your organization's API key and your platform's call id:

curl "https://api.thunderphone.com/v1/calls/handoff?external_call_id=YOUR_PLATFORM_CALL_ID" \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

The response has handoff.summary, handoff.intent and handoff.handoff_id, the SIP headers and variables the call started with and, once the call has ended, its summary and extracted data. You can also look a call up by handoff_id. See Look up a handed-off call.

Keep the API key in your platform's credential store, not in the flow itself.

Guides