Skip to content

Phone numbers for omnichannel partners: inbound and outbound calls with a Wetel agent (staging)

This content is not available in your language yet.

1. What you can demo next week and what you cannot

Section titled “1. What you can demo next week and what you cannot”
ScenarioStatusWho runs it
Inbound call to a US LiveKit numberVerified on staging (a real call answered by the AI, 2026-11-04)Wetel provisions the number and dispatch rule
Inbound call via carrier SIP trunk (Telnyx or Twilio, US)Designed, not yet run end to end (to verify)Wetel sets up the trunk; The partner dials in
Outbound call to a consented numberVerified on staging through a Telnyx trunk (a real call answered, the AI spoke, 2026-11-04)A Wetel engineer triggers the call manually
Outbound call triggered by a partner APINot builtThe partner-facing start-a-phone-call API is not deployed
Browser or app voice call via GraphQLWorking on stagingPartner server calls sdkStartVoiceCall with an API key
Inbound call to a Malaysian (+60) numberNot availableNumbers are in an advanced order
AI voice on WhatsApp callsNot availableRequires a media bridge that is not built

Three choices decide what you build. They are independent.

1. Does an AI answer, or only people?

ModeWhat it isNeeds Wetel?Status
People onlyNormal calls between your staff and customers on a carrier number.No. Use the carrier (for example Telnyx) and your own softphone or app.Outside Wetel. Wetel adds nothing here.
AI answersA Wetel AI agent talks to the caller, with a person as the fallback.Yes.Staging, run by Wetel.
AI first, then a personThe AI qualifies, then a person takes over.Yes, plus a transfer path.Not built: today the agent only offers a handover verbally.

2. Which AI voice engine? Both are meant to be selectable per agent.

EngineReply timeWorkflow, guardrails, toolsTranscript in WetelStatus
Speech-to-speech (Gemini Live)about 1.4 to 1.8 sNo: instructions onlyNoStaging, preview model
With the Wetel workflow (speech recognition, workflow, speech synthesis)about 3.5 s todayYes: the same published workflow as chatYes: the call is a sessionStaging. A streaming speech recognizer is being built to cut the wait.

Choose speech-to-speech for the fastest feel and simple questions. Choose the workflow engine when the call must follow guardrails, use tools or approvals, or be stored as a session.

3. Whose numbers?

OptionHowStatus
Wetel’s staging numbersDial a US number Wetel gives you for a session. Nothing to register or build. A free inbound US number and a carrier number that can also place outbound calls exist.Works on staging today.
Your own carrier numbersBuy numbers from a carrier (Telnyx recommended) and point an inbound SIP connection at Wetel’s SIP endpoint. We give you the endpoint and the matching trunk.Wetel side verified for one number; a second tenant is to verify.
Your own LiveKit projectRun the Wetel voice worker against your project.Not offered yet.

For the recommended stack, use one carrier (Telnyx) for all numbers in and out, and LiveKit Cloud for the media and the agent. A second carrier is only a fallback.

Getting a Telnyx number without registering yourself

Section titled “Getting a Telnyx number without registering yourself”

Registering with a carrier means identity checks, a funded balance and, for some countries, company documents. You can skip that for a test. Two ways, and neither involves sharing an API key.

WayWho owns the number and the billWhat you doBest for
Wetel provisions a test numberWetelAsk for a session. Wetel assigns a number from its own account and connects it to your test agent.A first demo, a short pilot
Your own Telnyx accountYouRegister, fund, buy a number, then follow the carrier SIP trunk recipe below with the endpoint from Wetel.Production, your own brand

Why Wetel does not hand out its carrier API key. A Telnyx API key is not scoped: whoever holds it can buy or release numbers, change connections and spend the account balance. A key shared with a partner team would be a key to everything on the account, so a leak or a mistake affects every other user of it. Instead:

  • For a test, Wetel creates the connection and number for you, names them after your project, and caps spend on the outbound profile (destinations, a daily limit).
  • For anything longer, use your own Telnyx account. Your balance, your numbers, your key.
  • If Wetel later offers per-partner Telnyx sub-accounts, each partner gets its own key and balance limit. This page will say so when it exists.

What you still need to build yourself is listed in section 6. Never paste a carrier key into chat, a ticket or a repository; send it only through the secret channel Wetel gives you.

flowchart LR
A[Caller dials\nphone number] --> B[Carrier\nTelnyx / Twilio / LiveKit]
B -->|SIP INVITE| C[LiveKit SIP endpoint]
C --> D[Dispatch rule matches\nwetel-voice-demo-inbound]
D --> E[LiveKit creates\na room per caller]
E --> F[Voice worker joins room]
F --> G[STT Gemini\n+ Agent brain\n+ TTS Google]
G -->|Audio back| E

The caller number is hidden from the room (hide_phone_number: true). Rooms use a fixed prefix. The same worker handles browser calls and phone calls. Barge-in is supported. Audio codec from PSTN is typically PCMU 8 kHz (narrowband, lower quality than web voice).

  1. Run the phone setup script to create the dispatch rule:

    Terminal window
    node tools/voice-demo/phone-setup.mjs rule
  2. Assign the dispatch rule to your LiveKit Cloud phone number. Use the dashboard or the CLI:

    Terminal window
    lk number update --number +1-555-0100 \
    --sip-dispatch-rule-id <DISPATCH_RULE_ID>
  3. Confirm the rule name is wetel-voice-demo-inbound.

  4. Call the number from any phone. The dispatch rule creates a room, dispatches the voice worker, and the agent answers.

This was verified on 2025-10-23. A call from a Malaysian mobile matched the rule and connected successfully.

See Telephony Quickstart for general setup details.

LiveKit SIP accepts INVITEs. It does not support REGISTER. Your carrier must send INVITEs to a stable address (IP or FQDN).

Supported: SIP over TLS, SRTP, DTMF (RFC 2833). Default codecs: PCMU, PCMA, G722.

  1. You need a paid Telnyx account. The Wetel Telnyx account is funded (USD 10). No number is purchased yet, so buy a US number first.

  2. Create an FQDN connection through the Telnyx v2 API. Set it to inbound (or both). Use caller number format +E.164. Set anchorsite_override to Latency. Associate the purchased number with the connection.

  3. Create an inbound trunk in LiveKit. Save this as inbound-trunk.json:

    {
    "trunk": {
    "name": "telnyx-inbound",
    "numbers": ["+1-555-0100"],
    "allowed_addresses": ["<TELNYX_FQDN>"],
    "auth_username": "<SIP_USERNAME>",
    "auth_password": "<SIP_PASSWORD>",
    "media_encryption": "allow"
    }
    }
  4. Create the trunk:

    Terminal window
    lk sip inbound create inbound-trunk.json
  5. Create or reuse the dispatch rule. Save as dispatch-rule.json:

    {
    "name": "wetel-voice-demo-inbound",
    "hide_phone_number": true,
    "rule": {
    "dispatchRuleIndividual": {
    "roomPrefix": "wetel-voice-"
    }
    }
    }
    Terminal window
    lk sip dispatch create dispatch-rule.json
  6. Call the purchased number. The INVITE reaches LiveKit SIP, the dispatch rule matches, and the agent joins.

Wetel has a Twilio account. Malaysian (+60) numbers need Malaysian company documents and an address, so use US numbers first.

  1. Create an Elastic SIP Trunk in Twilio. Set the origination URI to the LiveKit SIP address for inbound calls.

  2. For outbound termination, add a termination URI and credentials. (To verify: exact credential exchange steps against the LiveKit Twilio guide.)

  3. Create the inbound trunk and dispatch rule in LiveKit using the same steps as Telnyx above, replacing the allowed address with the Twilio signaling address.

See Call Flows for detailed routing diagrams.

Outbound calling is run by a Wetel engineer today. The partner-facing API to start a phone call is not built. The planned path is the voice worker call API (signed requests, see the API reference), which is not deployed.

  1. Create an outbound trunk. Save as outbound-trunk.json:

    {
    "trunk": {
    "name": "telnyx-outbound",
    "address": "<CARRIER_SIP_ADDRESS>",
    "numbers": ["+1-555-0100"],
    "transport": "tls",
    "auth_username": "<SIP_USERNAME>",
    "auth_password": "<SIP_PASSWORD>"
    }
    }
    Terminal window
    lk sip outbound create outbound-trunk.json
  2. Place the call:

    Terminal window
    lk sip participant create \
    --sip-trunk-id <TRUNK_ID> \
    --sip-call-to +1-555-0199 \
    --room-name wetel-voice-outbound-test \
    --wait-until-answered
  3. The voice worker joins the room. When the callee answers, the agent speaks.

  • Outbound only to numbers whose owner gave explicit consent.
  • Calls happen in daytime hours only.
  • Hard stop at 300 seconds.
  • A trial carrier may play a notice before the call connects.
  • No cold outbound calls under any circumstances.

See Controls and Compliance for the full policy.

6. What the partner needs to build around it

Section titled “6. What the partner needs to build around it”
AreaPartner sideWetel side
Start a phone callCall the partner API when ready (not built yet)Build and deploy the start-a-phone-call API (the voice worker call API with signed requests)
Call record and transcriptConsume the session transcript (same shape as chat)Return the transcript through the existing session model
Consent captureCollect and store opt-in from the number owner before any outbound callEnforce opt-in check before placing the call
Caller ID rulesDisplay the correct caller ID to the end userProvision numbers with the carrier; set outbound caller ID
Cost capsSet budget limits per campaign or per call (to verify: exact mechanism)Implement the cost shield (not built)
RecordingRequest recording on or off per callRecording is off by default; toggle per session
Malaysian numbersNo action until numbers are availableComplete the +60 advanced order and provision trunks

See API Reference for current endpoint documentation.

ProblemLikely causeFix
No audio after answerMedia encryption mismatch or onesided ofrtpCheck media_encryption on the inbound trunk. Confirm the carrier supports SRTP or set to allow. Verify codec negotiation.
Call does not reach the roomDispatch rule not assigned to the number, or allowed_addresses does not include the carrier IP/FQDNConfirm the dispatch rule ID on the number. Check allowed_addresses in the inbound trunk JSON.
Carrier requires REGISTERLiveKit SIP does not support REGISTERSwitch to a carrier that sends INVITEs to a stable address (FQDN or IP connection). Telnyx FQDN connections work.
Narrowband audio qualityPSTN calls negotiate PCMU 8 kHz by defaultThis is expected for PSTN. For higher quality, use G722 if the carrier supports it, or use browser-based calls.
Speech-to-text misses or errorsNarrowband audio, background noise, or latencyNarrowband reduces STT accuracy. Test in a quiet environment. The 4-5 second turn time is a known staging limitation.
Agent not dispatched into the roomVoice worker is not running, or the dispatch rule prefix does not matchConfirm the Wetel engineer has started the voice worker. Check that the room prefix in the dispatch rule matches the worker configuration.

8. Next steps and how to request a staging session

Section titled “8. Next steps and how to request a staging session”
  1. Request a staging session. Contact your Wetel counterpart. A Wetel person will start the voice worker and confirm the number or trunk is ready.

  2. Test inbound first. Use Recipe A (LiveKit US number) for the fastest path. Move to Recipe B (carrier trunk) when you need your own number or outbound.

  3. Plan the integration. Review the table in section 6. The start-a-phone-call API and the cost shield are the two blocking items on the Wetel side.

  4. Track the roadmap. Malaysian numbers, production deployment, and the partner call API are tracked at Telephony Roadmap.

  5. Read the full telephony docs. Start at Telephony Overview for architecture and concepts.

The call produces a session with a transcript, just like chat. The same published agent workflow and guardrails answer on both channels.