Agentic Voice Trunking

Link any AI voice agent to every phone system—cloud or on-site—in minutes.

Bring Your Own Carrier (BYOC)

Keep any SIP carrier you use today, then plug in your AI voice agent.

Cloud Native Trunking

Reach markets with local service providers—our Ultra Elastic SIP trunks work worldwide.

HD Audio Everywhere

Send HD sound to every call, everywhere.

One-click AI Integrations

One-click links to VAPI™, ReTell™, and other voice-AI partners.

Connect Anything

Attach cloud apps, carriers, or on-premise SIP gear in one step.

Why should I use cloudonix for my voice agents?

Cloudonix Make Scenario Diagram
Take control
Build your own voice agent call control tools and functions, enabling new functionalty – such as supervised transfers, conference calls, silent coaching and more.
Build Once
Build your agent workflow, then connect it to multiple telephony providers, phone systems and even voice agent platorms – one identical workflow, for multiple platforms.
Agentic Voice AI
Tried and Tested
Hundreds of businesses and agencies use Cloudonix to empower their voice agents with new capabilities – an AI first communications platform, designed for agencies and developers alike.

Simple and Straight Forward

Connect your voice agent with CXML

Use simple CXML documents to provide Cloudonix as straight forward routing scenario. Be it provided via a Container Application or as a remote webhook, routing calls is as simple as it gets with Cloudonix.

				
					<Response>
    <Dial>
        <Service provider="retel;">+12025551234</Service>
    </Dial>
</Response>
				
			
what is CXML?
Cloudonix Markup Language, or CXML for short is Cloudonix’s voice application development langauge. Using CXML, building interactive voice applications, using text-to-speech and speech-to-text, and more are your finger tips. To learn more about CXML and how to build voice applications, click here.
Dynamic Inbound Routing
Need dynamic logic? Deploy a container app and route calls with JavaScript—just like AWS Lambda or GCP Functions.
				
					const httpClient = require('https');

/* ReTell API Config */
const retell_token = "xxxxxx";
const retell_agent = "yyyyyyy";

async function httpsRequest(url, method = 'GET', headers = {}, body = null) {
    let response;

    if (method === 'POST') {
        response = await httpClient.post(url, { headers, body });
    } else if (method === 'PUT') {
        response = await httpClient.put(url, { headers, body });
    } else if (method === 'DELETE') {
        response = await httpClient.delete(url, { headers });
    } else if (method === 'GET') {
        response = await httpClient.get(url, { headers });
    } else {
        throw new Error(`Unsupported method: ${method}`);
    }

    const status = response.status || response.statusCode || 0;
    const ok = status >= 200 && status < 300;
    const responseBody = typeof response.body === 'string'
        ? response.body
        : JSON.stringify(response.body || {});

    return {
        status,
        ok,
        body: responseBody,
        headers: response.headers || {}
    };
}

async function generateReTellCall(ev) {
    const url = 'https://api.retellai.com/v2/register-phone-call';

    // SIP headers from Cloudonix
    const inboundSipHeaders = JSON.parse(ev.body).SessionData.profile['trunk-sip-headers'];

    const retellDynamicVariables = {
        cloudonix_callerid: ev.parameters.From,
        cloudonix_destination: ev.parameters.To,
        cloudonix_token: ev.parameters.Session,
        cloudonix_domain: ev.parameters.Domain
    };

    for (const key in inboundSipHeaders) {
        retellDynamicVariables[key] = inboundSipHeaders[key];
    }

    const payload = {
        agent_id: retell_agent,
        from_number: ev.parameters.From,
        to_number: ev.parameters.To,
        retell_llm_dynamic_variables: retellDynamicVariables
    };

    console.log(`Payload: ${JSON.stringify(payload)}`);

    const headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + retell_token
    };

    try {
        const response = await httpsRequest(url, 'POST', headers, JSON.stringify(payload));

        if (!response.ok) {
            throw new Error(`ReTell call creation failed: ${response.status} - ${response.body}`);
        }

        const data = JSON.parse(response.body);

        console.log(`Success: ${data.call_id}`);
        return data.call_id;
    } catch (error) {
        console.error(`Error:`, error.message || error);
        await deleteSession(ev.parameters.Domain, ev.parameters.Session);
        return false;
    }
}


function dialToRetellScript(ev, retellCallId) {
    let  result = `<Dial callerId="${ev.parameters.From}">`;
        result += `   <Service provider="retell">${retellCallId}</Service>`;
        result += `<Dial>`;
    return result;    
}

function response(content) {
    let result  = `<?xml version="1.0"?>`;
        result += `<Response>${content}</Response>`;
    return result;
}

exports.handler = async (ev) => {
    let retellCallId = await generateReTellCall(ev);
    let cxmlResponse =  dialToRetellScript(ev, retellCallId);
    return response(cxmlResponse);
};

				
			

Q&A

Learn about Cloudonix’s agentic voice trunking.

Isn't this Elastic SIP Trunking?

It is similar, but not exactly. Platforms such as VAPI™, ReTell™, LiveKit™ and others, enable their users to directly initiate calls to their voice agents – a direct SIP connection. However, each platform is different and requires a different SIP methodology. Cloudonix provides a single black-box experience to all of these, making them easily accessible – even without creating a SIP trunk to the agent voice platform.

I want to connect my carrier to Cloudonix, is it complicated?

Connecting your carrier to Cloudonix is a relatively simpler process. Unlike other platforms, Cloudonix takes a “black-box” approach to SIP Trunking, taking much of the “In-Depth Technical Know-How” and hides it, making the trunking process simple and quick.
Click here to learn more about Cloudonix Voice Trunk Management.

I've got my own PBX, can that be connected?
Yes! Keep your PBX and avoid extra call fees. Any vendor or open-source PBX can register to Cloudonix in minutes.
Do you have a compatibility list?

Yes, you can find our vendor, service and providers compatibility list here.

Can I connect to VAPI™ and ReTell™l?

To connect to various Voice Agent services, you don’t need a full SIP trunk, this can be performed using our <DIAL><Service> CXML verbs – read more here.

I'm not sure about my PBX, can you assist?

Sure, just join our community Discord server and talk to our staff directly.