mysterious-doctor-96559
03/17/2026, 8:23 PMtall-airline-16756
03/17/2026, 8:24 PMtall-airline-16756
03/17/2026, 8:24 PMsip_number field of the outbound CreateSIPParticipantRequest.
◦ Example conceptually:
▪︎ Create outbound SIP participant to target_agent_number
▪︎ Set sip_number = original_from_number so the receiving endpoint sees the true caller ID
• Important prerequisites:
◦ Your SIP trunk or PSTN provider must allow caller ID passthrough (ANI passthrough). Some providers require the outbound caller ID to be a verified/owned number, or block non‑verified caller IDs.
◦ If your PBX enforces its own outbound caller ID policies, those may override passthrough—check PBX and trunking configs.
• Transfer types:
◦ Cold transfer (SIP REFER) and warm transfer flows are supported; for warm transfers you can dial the human, confirm, then bridge everything while preserving caller ID.
◦ Use LiveKit’s transfer tasks (e.g., WarmTransferTask) or SIP REFER flows depending on desired behavior.
Next practical steps and questions for me to help further
• Confirm whether you want fully on‑prem (AI + LiveKit) or hybrid (Twilio/LiveKit Cloud acceptable).
• Tell me which PBX vendor and SIP trunk/provider you use (examples: Asterisk, FreePBX, Cisco UCM, Twilio, etc.) so I can call out vendor‑specific gotchas.
• Do you need DTMF IVR, call recording, or encryption (SRTP/TLS) requirements?
• Will the AI be real‑time (interactive agent) or a staged workflow (voicemail transcription, callback)?
If you confirm those details, I’ll provide:
• A recommended call flow diagram tailored to your choice (on‑prem vs hybrid).
• Concrete SIP request fields and example request payload (how to set sip_number) and any PBX/trunk settings to check.
• Notes on provider restrictions you should verify (caller ID verification, supported codecs, allowed SIP headers).
Happy to walk through a sample configuration once you tell me which hosting option and PBX/trunk you’re using.
Sources: Pricing | LiveKit | sip | livekit/livekit_composite | DeepWiki | Agents on LiveKit Cloud | Deploy voice AI on global infrastructure | LiveKi... | LiveKit Phone Numbers | Connect voice agents to phone lines | LiveKit | Agents telephony integration | LiveKit Documentation, with interactive elementsmysterious-doctor-96559
03/17/2026, 8:29 PMtall-airline-16756
03/17/2026, 8:30 PMif participant.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP:
phone_number = participant.attributes.get('sip.phoneNumber', 'Unknown')
await agent.session.say(f"Thank you for calling from {phone_number}. How can I help?")
Important caveats and checks
• Twilio and/or your SIP trunk/carrier must allow caller ID passthrough (ANI passthrough). Some providers require the outbound caller ID to be a verified number or will overwrite anonymous/unverified numbers.
• If Twilio or a carrier has configured privacy/anonymization, the original number may be hidden unless you change those settings.
• If you see unexpected numbers (trunk number or masked values), check Twilio’s SIP trunk configuration and any PBX outbound caller ID policies.
• You can also enable options to hide or reveal phone numbers in LiveKit dispatch rules; ensure those aren’t active if you need the original number available.
If you’d like, I can:
• Show an exact code snippet for your agent platform to read sip.phoneNumber.
• Walk through the Twilio SIP trunk settings to confirm caller ID passthrough rules.
• Help map the exact SIP headers LiveKit looks at if you want to verify headers on an incoming INVITE.
Which would be most helpful next?
Sources: Agents telephony integration | LiveKit Documentation | sip | livekit/livekit_composite | DeepWiki, with interactive elementsmysterious-doctor-96559
03/17/2026, 8:33 PMtall-airline-16756
03/17/2026, 8:33 PMsip.phoneNumber) so your agent can use it for logging, prompts, or passing as sip_number when dialing out.
• DTMF sending does not affect caller ID propagation—preserve caller ID by setting sip_number when creating outbound legs if you later bridge or transfer to a human.
Operational best practices
• Test with a small set of concurrent calls first to tune delays between DTMF events and to validate various IVR vendors behave consistently.
• Monitor call success rates, DTMF delivery, and latency. Add retries/backoff if a remote IVR doesn’t respond.
• Keep a pool of warmed agent workers to reduce cold start latency when calls spike.
• Confirm Twilio and any downstream carriers allow DTMF in-band or RFC2833 (choose the mode supported by your trunk), and ensure your SIP trunk configuration matches.
Questions that help me give exact steps
• Do you plan to run agents and STT/TTS on-premises or use LiveKit Cloud?
• Which DTMF mode does your Twilio->SIP trunk use (RFC2833/DTMF via RTP events, or in-band)? If you don’t know, I can point to where to check in Twilio.
• Do you need the agent to detect spoken prompts before sending DTMF, or are you sending fixed sequences immediately after connect?
If you confirm those, I’ll:
• Provide a short agent code snippet showing how to call send_dtmf_events after a SIP participant connects.
• Outline an autoscaling/worker sizing suggestion for 30 concurrent calls (and headroom).
• Provide the Twilio trunk settings to verify (DTMF mode, caller ID passthrough) so your DTMF and caller ID work reliably. Sources: send_dtmf_events | LiveKit Documentation | Preserving Caller ID During SIP Transfers in LiveKit Agents | examples/dtmf | livekit/livekit_composite | DeepWiki | SIP Lifecycle Management Agent | LiveKit Documentation | Agents Framework | livekit/livekit_composite | DeepWiki, with interactive elements