magnificent-monitor-48407
02/16/2026, 6:35 PMtall-airline-16756
02/16/2026, 6:35 PMtall-airline-16756
02/16/2026, 6:36 PMsip_number, sip_trunk_id, sip_call_to, etc., but there is no mechanism to inject Twilio’s programmable-voice CallToken into the outbound call from LiveKit.
2) Is there a planned LiveKit feature to support caller-ID forwarding via CallToken-like mechanism?
• There is no indication that such a feature (passing a Twilio CallToken through CreateSIPParticipantRequest) is currently available or scheduled.
3) Any other approaches to present the original inbound caller’s number on the outbound SIP call?
• Use CreateSIPParticipantRequest’s sip_number to request the original caller number as the outbound caller ID. This is the LiveKit-side way to present a specific caller number on the outbound SIP INVITE.
• Whether that caller ID is actually accepted and shown depends entirely on the SIP trunk provider’s policies. Twilio and Telnyx both return 403 when an unverified caller ID is used, which matches your tests.
• For Twilio specifically: Twilio supports preserving/passing the transferee’s caller ID at the trunk/configuration level (not via the CallToken flow). You can configure the SIP trunk to pass the original caller ID through transfers (for example, using the trunk transfer-caller-id setting such as from-transferee). That means instead of a CallToken-based REST call, you must ensure your Twilio trunk is configured to allow caller ID passthrough for transferred calls and that the number is permitted by Twilio’s verification/policy for that account/jurisdiction.
• In short: LiveKit can request the original number via sip_number, but acceptance requires Twilio (or whichever SIP provider) to allow that number on the trunk. The CallToken REST flow is incompatible with a pure SIP INVITE path and can’t be injected by CreateSIPParticipantRequest.
Recommended next steps
1. Re-check Twilio trunk settings
◦ Confirm the trunk is configured to allow caller ID passthrough on transfer (e.g., transfer-caller-id from-transferee or equivalent in Twilio console / SIP trunk settings).
◦ Verify whether Twilio requires caller numbers to be validated for your account or region; if so, follow Twilio’s verification process for the original caller numbers you need to present (some jurisdictions or accounts enforce verification).
1. Continue using sip_number in CreateSIPParticipantRequest
◦ Keep setting sip_number to the original caller’s number when creating the supervisor participant. LiveKit will put that number in the outbound SIP INVITE; acceptance depends on the trunk.
1. If Twilio’s trunk policy disallows the passthrough for your use-case
◦ Consider whether your architecture can route inbound calls through Twilio Programmable Voice (HTTP webhook) instead of SIP INVITE so you can use the CallToken/REST mechanism — I realize that’s incompatible with your current SIP-based inbound flow, but it is how Twilio’s CallToken flow works.
◦ Alternatively, check with Twilio whether they can enable per-account transfer caller ID passthrough or provide a recommended pattern for warm transfers when the incoming call arrives by SIP INVITE (some customers use trunk-level transfer settings or specific call transfer flows Twilio supports).
If you’d like, I can help with any of the following:
• Review the exact CreateSIPParticipantRequest payload you’re sending (mask sensitive data) and confirm you’re populating sip_number correctly.
• Walk through Twilio trunk settings to find the specific transfer-caller-id or equivalent option and the steps to enable it.
• Outline an alternate architecture that uses Programmable Voice for inbound calls (so the CallToken approach is possible), if you want to evaluate that tradeoff.
Which would you like to do next?
Sources: Preserving Caller ID During SIP Transfers in LiveKit Agents | Preserve caller ID during SIP transfers with Twilio | LiveKitmagnificent-monitor-48407
02/16/2026, 6:45 PMtall-airline-16756
02/16/2026, 6:45 PMsip_number field when creating a SIP participant (CreateSIPParticipantRequest). That places the desired number into the outgoing SIP INVITE.
• Whether Twilio will accept and present that caller ID depends entirely on Twilio’s trunk/account configuration and number verification policies.
• Important distinction for Twilio:
◦ Twilio’s CallToken approach (used with Programmable Voice REST API) lets you preserve/present the original caller number when Twilio itself is creating the outbound call via its REST/Twilio webhook flow.
◦ When using pure SIP INVITE (SIP trunking), the CallToken flow is not available. Instead you must configure the Twilio trunk to allow caller ID passthrough on transfers (e.g., use the trunk setting to set caller ID from the transferee: from-transferee / “transfer caller ID from transferee”).
• Practical outcomes:
◦ If you keep your SIP-trunk-only flow (LiveKit issuing SIP INVITEs to Twilio), continue using sip_number. Then make sure your Twilio trunk is configured to allow that number to be presented (and verify numbers if Twilio requires).
◦ If Twilio refuses unverified caller IDs on your trunk (403), you have two options:
▪︎ Configure trunk-level caller ID passthrough or verify numbers in Twilio per their policy.
▪︎ Change the flow so Twilio creates the outbound call (Programmable Voice REST/webhook + CallToken) before connecting to LiveKit. That lets you use Twilio’s CallToken to present original caller ID, but requires inbound calls to be handled by Twilio’s webhook/REST rather than arriving directly to LiveKit via SIP INVITE.
Recommended next steps I can help with
• If you want to keep SIP trunking (current flow):
◦ I can review the CreateSIPParticipantRequest payload you’re using (mask sensitive data) and confirm sip_number usage.
◦ Check Twilio trunk settings: I can walk you through the specific Twilio trunk option to enable transfer caller-ID passthrough (from-transferee) and what verification steps Twilio may require.
• If you’re open to switching to a Programmable Voice webhook flow:
◦ I can outline the webhook + TwiML approach that returns a TwiML <Dial><Sip> to LiveKit, and explain how to use CallToken when Twilio makes the outbound call so the original caller number is preserved.
• If you want a direct checklist right now:
a. Try setting sip_number on CreateSIPParticipantRequest to the original caller’s number.
b. In Twilio Console, enable caller ID passthrough/transfer settings on the trunk (look for “transfer caller ID” / from-transferee).
c. If Twilio returns 403, verify whether Twilio requires caller ID registration or whether you must use the CallToken REST flow instead.
d. If CallToken is required and you cannot change Twilio trunk settings, route inbound calls through Twilio Programmable Voice (webhook) so Twilio can create the outbound call with CallToken.
Which path would you like to try first?
• Keep SIP Trunk path and I’ll help confirm LiveKit payload + Twilio trunk settings, or
• Move to Programmable Voice webhook/CallToken flow and I’ll give the exact webhook/TwiML and flow changes needed.
Tell me which option you prefer and, if you want the SIP-trunk path, please share (masked) the CreateSIPParticipantRequest payload you’re sending and the exact Twilio 403 error message — I’ll help diagnose next.
Sources: OpenAI and LiveKit partner to turn Advanced Voice into an API | Outbound Calling Script | LiveKit Documentation | Accepting calls overview | LiveKit Documentation | Preserve caller ID during SIP transfers with Twilio | LiveKit | Agents (Node.js) | livekit/livekit_composite | DeepWiki