<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Iftekhairul Alam</title>
    <description>The latest articles on Forem by Iftekhairul Alam (@masum0009).</description>
    <link>https://forem.com/masum0009</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3074891%2F4fd1edd7-4cde-4934-91c9-cffe06babc1f.png</url>
      <title>Forem: Iftekhairul Alam</title>
      <link>https://forem.com/masum0009</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/masum0009"/>
    <language>en</language>
    <item>
      <title>Connecting AI Voice Agents to SIP &amp; PSTN Using NextGenSwitch</title>
      <dc:creator>Iftekhairul Alam</dc:creator>
      <pubDate>Fri, 06 Feb 2026 05:14:52 +0000</pubDate>
      <link>https://forem.com/masum0009/connecting-ai-voice-agents-to-sip-pstn-using-nextgenswitch-35fi</link>
      <guid>https://forem.com/masum0009/connecting-ai-voice-agents-to-sip-pstn-using-nextgenswitch-35fi</guid>
      <description>&lt;h2&gt;
  
  
  Bridging AI Voice Agents with Real Phone Calls
&lt;/h2&gt;

&lt;p&gt;Building an AI voice agent is relatively easy today.&lt;br&gt;&lt;br&gt;
Connecting that agent to &lt;strong&gt;real phone calls (SIP, PBX, PSTN)&lt;/strong&gt; is not.&lt;/p&gt;

&lt;p&gt;Most AI voice systems are designed to work with &lt;strong&gt;WebSockets and raw audio streams&lt;/strong&gt;, while production telephony still relies on &lt;strong&gt;SIP, RTP, and PSTN infrastructure&lt;/strong&gt;. This mismatch is where many voice-AI projects struggle to move beyond demos.&lt;/p&gt;

&lt;p&gt;This post explains how &lt;strong&gt;NextGenSwitch&lt;/strong&gt; bridges that gap—allowing &lt;strong&gt;any AI voice system&lt;/strong&gt; to interact with real phone callers using a &lt;strong&gt;Twilio-style streaming interface&lt;/strong&gt;, without exposing SIP or RTP complexity to AI developers.&lt;/p&gt;

&lt;p&gt;🔗 Original post:&lt;br&gt;&lt;br&gt;
&lt;a href="https://nextgenswitch.com/blog/connecting-ai-voice-agents-to-sip-pstn-using-nextgenswitch/" rel="noopener noreferrer"&gt;https://nextgenswitch.com/blog/connecting-ai-voice-agents-to-sip-pstn-using-nextgenswitch/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Core Problem
&lt;/h2&gt;

&lt;p&gt;AI voice systems typically expect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
WebSocket → PCM audio → AI pipeline → PCM audio

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Telephony systems operate very differently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
PSTN → SIP Trunk → PBX → RTP (μ-law / A-law)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key challenges include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SIP and RTP are stateful and codec-sensitive&lt;/li&gt;
&lt;li&gt;AI systems expect clean, ordered audio frames&lt;/li&gt;
&lt;li&gt;Handling barge-in, latency, and scaling is non-trivial&lt;/li&gt;
&lt;li&gt;Most AI frameworks are not PBX-aware&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Role of NextGenSwitch
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NextGenSwitch&lt;/strong&gt; acts as a &lt;strong&gt;telephony abstraction layer&lt;/strong&gt; between traditional phone systems and modern AI services.&lt;/p&gt;

&lt;p&gt;It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SIP &amp;amp; PSTN termination&lt;/li&gt;
&lt;li&gt;Integration with PBX systems (Asterisk / FreeSWITCH)&lt;/li&gt;
&lt;li&gt;A Twilio-style Programmable Voice API&lt;/li&gt;
&lt;li&gt;Real-time WebSocket audio streaming&lt;/li&gt;
&lt;li&gt;Codec and sample-rate normalization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your AI service never has to interact directly with SIP or RTP.&lt;/p&gt;




&lt;h2&gt;
  
  
  High-Level Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Caller
|
[PSTN / SIP Trunk]
|
[Asterisk / FreeSWITCH]
|
[NextGenSwitch]
| &amp;lt;WebSocket Audio Stream&amp;gt;
|
[AI Voice Service]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;The AI voice service can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A custom WebSocket server&lt;/li&gt;
&lt;li&gt;A cloud-based AI endpoint&lt;/li&gt;
&lt;li&gt;An on-prem STT + LLM + TTS stack&lt;/li&gt;
&lt;li&gt;Any framework capable of handling real-time audio&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Twilio-Style XML Call Control
&lt;/h2&gt;

&lt;p&gt;When a call reaches NextGenSwitch, it fetches XML instructions—similar to Twilio’s TwiML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minimal XML (only the stream URL is required)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;xml&lt;br&gt;
&amp;lt;Response&amp;gt;&lt;br&gt;
  &amp;lt;Connect&amp;gt;&lt;br&gt;
    &amp;lt;Stream url="wss://ai.yourdomain.com/ws/voice-agent"/&amp;gt;&lt;br&gt;
  &amp;lt;/Connect&amp;gt;&lt;br&gt;
&amp;lt;/Response&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;This instruction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answers the call&lt;/li&gt;
&lt;li&gt;Opens a bidirectional WebSocket&lt;/li&gt;
&lt;li&gt;Starts real-time audio streaming&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Optional Parameters (Examples Only)
&lt;/h3&gt;

&lt;p&gt;Parameters are &lt;strong&gt;not mandatory&lt;/strong&gt;.&lt;br&gt;
They are passed as metadata to your AI service.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`xml&lt;br&gt;
&amp;lt;Response&amp;gt;&lt;br&gt;
  &amp;lt;Connect&amp;gt;&lt;br&gt;
    &amp;lt;Stream url="wss://ai.yourdomain.com/ws/voice-agent"&amp;gt;&lt;br&gt;
      &amp;lt;Parameter name="agent" value="support-bot"/&amp;gt;&lt;br&gt;
      &amp;lt;Parameter name="tenant_id" value="company-01"/&amp;gt;&lt;br&gt;
      &amp;lt;Parameter name="language" value="en-US"/&amp;gt;&lt;br&gt;
    &amp;lt;/Stream&amp;gt;&lt;br&gt;
  &amp;lt;/Connect&amp;gt;&lt;br&gt;
&amp;lt;/Response&amp;gt;&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;These values appear in the JSON &lt;code&gt;start&lt;/code&gt; event and can be used for routing, prompts, or CRM lookups.&lt;/p&gt;




&lt;h2&gt;
  
  
  WebSocket Streaming Protocol (JSON)
&lt;/h2&gt;

&lt;p&gt;NextGenSwitch uses a &lt;strong&gt;Twilio Media Streams–style JSON protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your AI service only needs to handle a small set of events.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;start&lt;/code&gt; Event
&lt;/h3&gt;

&lt;p&gt;Sent once when the stream begins.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`json&lt;br&gt;
{&lt;br&gt;
  "event": "start",&lt;br&gt;
  "streamId": "NGS_STREAM_123456",&lt;br&gt;
  "start": {&lt;br&gt;
    "callId": "NGS_CALL_abc",&lt;br&gt;
    "from": "+8801XXXXXXXXX",&lt;br&gt;
    "to": "5000",&lt;br&gt;
    "customParameters": {&lt;br&gt;
      "agent": "support-bot",&lt;br&gt;
      "tenant_id": "company-01"&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Save the &lt;code&gt;streamId&lt;/code&gt;—it must be included in outbound audio messages.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;media&lt;/code&gt; Event (Inbound Audio)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;`json&lt;br&gt;
{&lt;br&gt;
  "event": "media",&lt;br&gt;
  "streamId": "NGS_STREAM_123456",&lt;br&gt;
  "media": {&lt;br&gt;
    "payload": "BASE64_AUDIO_BYTES=="&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Audio characteristics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codec: &lt;strong&gt;G.711 μ-law&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Sample rate: &lt;strong&gt;8 kHz&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Payload: base64-encoded audio frames&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;media&lt;/code&gt; Event (Outbound Audio)
&lt;/h3&gt;

&lt;p&gt;Your AI service responds using the same structure:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`json&lt;br&gt;
{&lt;br&gt;
  "event": "media",&lt;br&gt;
  "streamId": "NGS_STREAM_123456",&lt;br&gt;
  "media": {&lt;br&gt;
    "payload": "BASE64_AUDIO_BYTES=="&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;NextGenSwitch converts this audio back into telephony format and sends it to the caller.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;stop&lt;/code&gt; Event
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;`json&lt;br&gt;
{&lt;br&gt;
  "event": "stop",&lt;br&gt;
  "streamId": "NGS_STREAM_123456",&lt;br&gt;
  "stop": {&lt;br&gt;
    "reason": "hangup"&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Stack: Fully Flexible
&lt;/h2&gt;

&lt;p&gt;NextGenSwitch does &lt;strong&gt;not&lt;/strong&gt; require any specific AI framework.&lt;/p&gt;

&lt;p&gt;You can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any STT engine&lt;/li&gt;
&lt;li&gt;Any LLM&lt;/li&gt;
&lt;li&gt;Any TTS engine&lt;/li&gt;
&lt;li&gt;Any programming language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frameworks like Pipecat can be used as &lt;strong&gt;reference implementations&lt;/strong&gt;, but they are &lt;strong&gt;not required&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Architecture Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No SIP or RTP handling in AI code&lt;/li&gt;
&lt;li&gt;Twilio-style, developer-friendly interface&lt;/li&gt;
&lt;li&gt;Real-time, low-latency audio streaming&lt;/li&gt;
&lt;li&gt;Vendor-neutral AI integration&lt;/li&gt;
&lt;li&gt;Production-ready PSTN scalability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI receptionist&lt;/li&gt;
&lt;li&gt;AI call center agents&lt;/li&gt;
&lt;li&gt;Voice-based order processing&lt;/li&gt;
&lt;li&gt;Appointment booking&lt;/li&gt;
&lt;li&gt;IVR replacement&lt;/li&gt;
&lt;li&gt;Multilingual voice bots&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Only the &lt;code&gt;&amp;lt;Stream url&amp;gt;&lt;/code&gt; is mandatory&lt;/li&gt;
&lt;li&gt;XML parameters are optional metadata&lt;/li&gt;
&lt;li&gt;Streaming protocol is Twilio-style JSON&lt;/li&gt;
&lt;li&gt;Telephony audio uses μ-law @ 8kHz&lt;/li&gt;
&lt;li&gt;AI logic is completely decoupled from PBX logic&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Learn More
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Programmable Voice Stream API&lt;br&gt;
&lt;a href="https://nextgenswitch.com/docs/programmable-voice-api/#stream" rel="noopener noreferrer"&gt;https://nextgenswitch.com/docs/programmable-voice-api/#stream&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI streaming examples&lt;br&gt;
&lt;a href="https://github.com/nextgenswitch/ai_agents" rel="noopener noreferrer"&gt;https://github.com/nextgenswitch/ai_agents&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>asterisk</category>
      <category>freeswitch</category>
      <category>ai</category>
      <category>sip</category>
    </item>
    <item>
      <title>NextGenSwitch: Build AI-Powered Telephony (Features, Examples, and a Developer Quickstart)</title>
      <dc:creator>Iftekhairul Alam</dc:creator>
      <pubDate>Wed, 29 Oct 2025 10:33:17 +0000</pubDate>
      <link>https://forem.com/masum0009/nextgenswitch-build-ai-powered-telephony-features-examples-and-a-developer-quickstart-3apc</link>
      <guid>https://forem.com/masum0009/nextgenswitch-build-ai-powered-telephony-features-examples-and-a-developer-quickstart-3apc</guid>
      <description>&lt;p&gt;If you’ve ever hacked together SIP trunks, WebRTC agents, IVRs, recordings—and then tried to bolt on an AI receptionist—you know the pain. &lt;strong&gt;&lt;a href="https://nextgenswitch.com" rel="noopener noreferrer"&gt;NextGenSwitch (NGS)&lt;/a&gt;&lt;/strong&gt; is a modern softswitch with &lt;strong&gt;programmable voice&lt;/strong&gt; and &lt;strong&gt;first-class AI hooks&lt;/strong&gt; that makes this stack &lt;em&gt;delightfully&lt;/em&gt; straightforward.&lt;br&gt;
Repo: &lt;strong&gt;&lt;a href="https://github.com/nextgenswitch/nextgenswitch" rel="noopener noreferrer"&gt;github.com/nextgenswitch/nextgenswitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A whirlwind tour of &lt;strong&gt;features&lt;/strong&gt; and &lt;strong&gt;architecture&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Exactly how &lt;strong&gt;AI integrations&lt;/strong&gt; plug in (LLMs, realtime voice, function-calling)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;copy-paste Quickstart&lt;/strong&gt; (outbound calls, XML verbs, status callbacks, live call modify)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev procedures&lt;/strong&gt; and a production checklist&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; NGS offers Twilio-style call control with softswitch power under the hood—plus clean integration points for LLMs and your backend tools.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What is NextGenSwitch?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://nextgenswitch.com" rel="noopener noreferrer"&gt;NextGenSwitch (NGS)&lt;/a&gt;&lt;/strong&gt; is a cloud softswitch + programmable voice layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SIP + WebRTC&lt;/strong&gt;: bridge PSTN/SIP customers to browser-based agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Programmable Calls&lt;/strong&gt; with XML/JSON-style responses from your webhooks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IVR, Gather, Queueing, Recording&lt;/strong&gt; built-in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events &amp;amp; CDRs&lt;/strong&gt; for observability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-native&lt;/strong&gt;: stream audio to a realtime LLM, or do turn-by-turn ASR ? LLM ? TTS; call your own tools (helpdesk, CRM, calendar, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Feature Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Outbound API&lt;/strong&gt;: originate calls and drive the flow with hosted XML or inline &lt;code&gt;responseXml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inbound Webhooks&lt;/strong&gt;: answer URL returns NGS verbs like &lt;code&gt;&amp;lt;Say&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Play&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Gather&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Dial&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Record&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status Callbacks&lt;/strong&gt;: get &lt;code&gt;DIALING&lt;/code&gt;, &lt;code&gt;RINGING&lt;/code&gt;, &lt;code&gt;ESTABLISHED&lt;/code&gt;, &lt;code&gt;DISCONNECTED&lt;/code&gt;, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modify-Live&lt;/strong&gt;: push new instructions mid-call (e.g., speak a message, transfer, or bridge).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recording + Transcription&lt;/strong&gt;: trigger, store, and process (e.g., summarize with LLMs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queues &amp;amp; Skills&lt;/strong&gt;: route by priority, business hours, or sticky agent.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Architecture at a Glance
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Caller (PSTN/SIP)
        ¦
        ?
   NGS Ingress --? Your Webhook
        ¦              ¦
        ¦              +-? LLM (realtime or text)
        ¦              +-? Tools (tickets, CRM, calendar)
        ¦              +-? Business logic (IVR/queues/policies)
        ?
   Media Engine (SIP/WebRTC, TTS/ASR)
        ¦
        +-? Agent Browser (WebRTC)
        +-? Upstream SIP / PSTN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You keep your business logic server-side; NGS handles signaling, media, and scale.&lt;/p&gt;


&lt;h2&gt;
  
  
  AI Integrations (How it actually fits)
&lt;/h2&gt;

&lt;p&gt;You’ve got two common patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turn-based&lt;/strong&gt;&lt;br&gt;
NGS records/streams ? your server gets transcript ? you ask an LLM what to do ? return NGS actions (&lt;code&gt;&amp;lt;Say&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Gather&amp;gt;&lt;/code&gt;, enqueue, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Realtime voice&lt;/strong&gt;&lt;br&gt;
Full-duplex audio between caller and LLM (e.g., OpenAI Realtime, Gemini Live). The LLM can produce audio or directives; your webhook can still inject actions (transfer, record, ticketing).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Function-calling / Tools:&lt;/strong&gt; define JSON schemas like &lt;code&gt;create_support_ticket&lt;/code&gt;, &lt;code&gt;schedule_appointment&lt;/code&gt;, &lt;code&gt;lookup_customer&lt;/code&gt;. When the LLM calls a tool, you do the API call, then continue the conversation with the caller.&lt;/p&gt;


&lt;h2&gt;
  
  
  Developer Quickstart (Copy-Paste)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Replace &lt;code&gt;YOUR_NGS_BASE_URL&lt;/code&gt;, &lt;code&gt;YOUR_AUTH_ID&lt;/code&gt;, &lt;code&gt;YOUR_AUTH_SECRET&lt;/code&gt; and public URLs where applicable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  1) Outbound Call — Hosted XML (via &lt;code&gt;response&lt;/code&gt;) &lt;em&gt;or&lt;/em&gt; Inline (via &lt;code&gt;responseXml&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Option A: hosted XML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Authorization: YOUR_AUTH_ID"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Authorization-Secre: YOUR_AUTH_SECRET"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"to=1002"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"from=1001"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"statusCallback=https://example.com/voice/status"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"response=https://example.com/voice/hello.xml"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://YOUR_NGS_BASE_URL/api/v1/call
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option B: inline XML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Authorization: YOUR_AUTH_ID"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Authorization-Secre: YOUR_AUTH_SECRET"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'to=1002'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'from=1001'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'statusCallback=https://example.com/voice/status'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'responseXml=&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&amp;lt;Response&amp;gt;&amp;lt;Say&amp;gt;Hello from inline XML&amp;lt;/Say&amp;gt;&amp;lt;/Response&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://YOUR_NGS_BASE_URL/api/v1/call
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Minimal XML you can host at&lt;/strong&gt; &lt;code&gt;https://example.com/voice/hello.xml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Say&amp;gt;&lt;/span&gt;Hello, world! This call is powered by NextGenSwitch.&lt;span class="nt"&gt;&amp;lt;/Say&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2) Status Callbacks (Receive live events)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Node/Express&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt; &lt;span class="c1"&gt;// NGS posts form-encoded&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/voice/status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NGS status:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// e.g., { call_id, status, timestamp, ... }&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                   &lt;span class="c1"&gt;// respond fast; do heavy work async&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status callback on :3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample payload (form-encoded):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;call_id=abc123
status=RINGING
timestamp=2025-10-29T08:00:00Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3) Modify a Live Call (push new instructions)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Authorization: YOUR_AUTH_ID"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Authorization-Secre: YOUR_AUTH_SECRET"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'responseXml=&amp;lt;Response&amp;gt;&amp;lt;Pause length="2"/&amp;gt;&amp;lt;Say&amp;gt;Call has been modified&amp;lt;/Say&amp;gt;&amp;lt;Dial&amp;gt;1000&amp;lt;/Dial&amp;gt;&amp;lt;/Response&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://YOUR_NGS_BASE_URL/api/v1/call/REPLACE_WITH_CALL_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4) Multi-language Examples (Node, Python, PHP)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Node (fetch)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Node &amp;lt;18; otherwise use global fetch&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://YOUR_NGS_BASE_URL&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/call`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/x-www-form-urlencoded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_AUTH_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-Authorization-Secre&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_AUTH_SECRET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1002&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;statusCallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/voice/status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;responseXml&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;?xml version="1.0"?&amp;gt;&amp;lt;Response&amp;gt;&amp;lt;Say&amp;gt;Hello from Node&amp;lt;/Say&amp;gt;&amp;lt;/Response&amp;gt;`&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Python (requests)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://YOUR_NGS_BASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_AUTH_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Authorization-Secre&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_AUTH_SECRET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1002&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;statusCallback&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/voice/status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;responseXml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;?&amp;gt;&amp;lt;Response&amp;gt;&amp;lt;Say&amp;gt;Hello from Python&amp;lt;/Say&amp;gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/api/v1/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PHP (Guzzle)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;GuzzleHttp\Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'base_uri'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://YOUR_NGS_BASE_URL'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/api/v1/call'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'headers'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'X-Authorization'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YOUR_AUTH_ID'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'X-Authorization-Secre'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YOUR_AUTH_SECRET'&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s1"&gt;'form_params'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'to'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'1002'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'from'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'1001'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'statusCallback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com/voice/status'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'responseXml'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;?xml version="1.0"?&amp;gt;&amp;lt;Response&amp;gt;&amp;lt;Say&amp;gt;Hello from PHP&amp;lt;/Say&amp;gt;&amp;lt;/Response&amp;gt;'&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getBody&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  XML Verb Cheatsheet (NGS Actions)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;Say&amp;gt;&lt;/code&gt;&lt;/strong&gt;: TTS
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&amp;lt;Say&lt;/span&gt; &lt;span class="na"&gt;loop=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This message repeats twice.&lt;span class="nt"&gt;&amp;lt;/Say&amp;gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;Play&amp;gt;&lt;/code&gt;&lt;/strong&gt;: play a media file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&amp;lt;Play&lt;/span&gt; &lt;span class="na"&gt;loop=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;https://example.com/audio/connecting.mp3&lt;span class="nt"&gt;&amp;lt;/Play&amp;gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;Gather&amp;gt;&lt;/code&gt;&lt;/strong&gt;: collect DTMF and POST to your action URL
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Gather&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/process_input"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt; &lt;span class="na"&gt;maxDigits=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt; &lt;span class="na"&gt;timeout=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Say&amp;gt;&lt;/span&gt;Please enter your 4-digit PIN.&lt;span class="nt"&gt;&amp;lt;/Say&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Gather&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;Dial&amp;gt;&lt;/code&gt;&lt;/strong&gt;: bridge to a number/endpoint
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Dial&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"+1234567890"&lt;/span&gt; &lt;span class="na"&gt;answerOnBridge=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;record=&lt;/span&gt;&lt;span class="s"&gt;"record-from-answer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Play&amp;gt;&lt;/span&gt;https://example.com/audio/connecting.mp3&lt;span class="nt"&gt;&amp;lt;/Play&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Dial&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;lt;Record&amp;gt;&lt;/code&gt;&lt;/strong&gt;: start a recording
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Record&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/handle_recording"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt; &lt;span class="na"&gt;timeout=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; &lt;span class="na"&gt;finishOnKey=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;beep=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other useful controls: &lt;code&gt;&amp;lt;Hangup&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Pause&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Redirect&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Bridge&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Leave&amp;gt;&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Development Procedures (What to actually do)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create envs &amp;amp; keys&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NGS_AUTH_ID&lt;/code&gt;, &lt;code&gt;NGS_AUTH_SECRET&lt;/code&gt;, &lt;code&gt;WEBHOOK_SECRET&lt;/code&gt; (if verifying signatures)&lt;/li&gt;
&lt;li&gt;LLM keys, Helpdesk/CRM tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Expose your server&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ngrok http 3000&lt;/code&gt; (or Cloudflare Tunnel) for &lt;code&gt;/voice/answer&lt;/code&gt;, &lt;code&gt;/voice/status&lt;/code&gt;, &lt;code&gt;/voice/ai&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Provision routing&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Buy/assign a number ? set &lt;strong&gt;Answer URL&lt;/strong&gt; (returns XML) and &lt;strong&gt;Status Callback&lt;/strong&gt; URL&lt;/li&gt;
&lt;li&gt;Add queues (sales/support) with skills/hours if needed&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Logging &amp;amp; Idempotency&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Treat status webhooks as retryable; de-dupe by &lt;code&gt;event_id&lt;/code&gt; if provided&lt;/li&gt;
&lt;li&gt;Correlate &lt;code&gt;call_id&lt;/code&gt; across logs, DB, and tickets&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Verify webhook signatures/timestamps&lt;/li&gt;
&lt;li&gt;Encrypt recordings; redact sensitive entities from transcripts&lt;/li&gt;
&lt;li&gt;Rotate secrets, enforce MFA&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Unit test your XML builders&lt;/li&gt;
&lt;li&gt;Simulate DTMF and edge flows (timeouts, invalid digits)&lt;/li&gt;
&lt;li&gt;Load test queue wait, ASR ? LLM latency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting (Quick)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401/403&lt;/strong&gt; ? Check &lt;code&gt;X-Authorization&lt;/code&gt; / secret headers (your deployment may use &lt;code&gt;X-Authorization-Secre&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;400&lt;/strong&gt; ? XML missing/invalid; start with &lt;code&gt;&amp;lt;Response&amp;gt;&amp;lt;Say&amp;gt;…&amp;lt;/Say&amp;gt;&amp;lt;/Response&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;“Rings but no audio”&lt;/strong&gt; ? If using hosted &lt;code&gt;response&lt;/code&gt;, ensure your XML URL is public &amp;amp; returns valid XML with correct &lt;code&gt;Content-Type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No status events&lt;/strong&gt; ? Verify public &lt;code&gt;statusCallback&lt;/code&gt; URL; log incoming requests; keep handler fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live modify does nothing&lt;/strong&gt; ? Confirm &lt;code&gt;call_id&lt;/code&gt; and that your &lt;code&gt;PUT&lt;/code&gt; payload contains a valid &lt;code&gt;responseXml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Links &amp;amp; Credits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;strong&gt;&lt;a href="https://nextgenswitch.com" rel="noopener noreferrer"&gt;nextgenswitch.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;strong&gt;&lt;a href="https://github.com/nextgenswitch/nextgenswitch" rel="noopener noreferrer"&gt;github.com/nextgenswitch/nextgenswitch&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Wrap-Up
&lt;/h2&gt;

&lt;p&gt;With &lt;strong&gt;&lt;a href="https://nextgenswitch.com" rel="noopener noreferrer"&gt;NextGenSwitch&lt;/a&gt;&lt;/strong&gt;, you write simple webhooks and XML while the platform handles media and scale. Add &lt;strong&gt;AI&lt;/strong&gt; for triage, summarization, or full conversational agents, and route to humans when it matters. The examples above are ready to paste—use them as a base, then layer in your product logic.&lt;/p&gt;

&lt;p&gt;If you ship something with this, share a link—I’d love to see your call flows, response times, and UI patterns!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>callcenter</category>
      <category>pbx</category>
    </item>
  </channel>
</rss>
