<?xml version="1.0"?>
<doc xmlns:tcx="http://www.3cx.com">
<header>
    <type>gateway-template</type>
    <version>150008</version>
    <time>2026-11-09 16:00:00</time>
    <name>Thread Voice AI</name>
    <url>https://docs.getthread.com/ai-agents/connect-3cx-to-voice-ai-with-a-sip-trunk</url>
    <image>default-icon.png</image>
    <logo>default-logo.png</logo>
    <description>AR,AT,AU,BE,BG,BR,CA,CH,CL,CN,CY,CZ,DE,DK,ES,FR,GR,HK,HR,HU,IE,IL,IN,IS,IT,JP,LT,LV,MT,MX,MY,NL,NO,NZ,PE,PL,PT,RO,RU,SE,SG,SI,SK,TH,TR,UA,UK,US,VN,Worldwide,ZA</description>
    <priority>2</priority>
    <tags>registrar,proxy,IpInContactReg,PublicIPVia,SecondaryRegistrar,port,advanced,cert,3wayauth,authtype,geo911,e164</tags>
    <templatetype>thirdparty</templatetype>
</header>
<data>
   <device>
      <type>provider</type>
      <manufacturer>Thread Voice AI</manufacturer>
      <model>Provider</model>

      <!-- Friendly Name -->
      <field name="Name">Thread Voice AI</field>

      <!-- Hostnames and Port Numbers: set Registrar/Server to Thread's SIP address from the Thread admin app -->
      <field name="RegistrarHost"></field>
      <field name="RegistrarPort">5060</field>
      <field name="ProxyHost"></field>
      <field name="ProxyPort">5060</field>
      <field name="StunServerHost"></field>
      <field name="StunServerPort"></field>

      <!-- Registration Settings -->
      <field name="LineAuthenticationPassword" status="readonly"></field>
      <field name="TimeBetweenRegistration">180</field>
      <field name="RequireAuthFor">1</field>
      <field name="IpInContactReg">1</field>
      <field name="IpInContactRegValue"></field>
      <field name="3wayauthenticationid" status="readonly"></field>

      <!-- Provider Capabilities -->
      <field name="IsSupportReinvite">0</field>
      <field name="IsSupportReplaces">0</field>
      <field name="DisableVideo">1</field>
      <field name="RegistrarInvite">1</field>

      <!-- Location of Destination Number -->
      <field name="DestNumberIn_TO">1</field>
      <field name="DestNumberIn_REQLINEURI">1</field>
      <field name="DestNumberIn_RPID_CALLED">0</field>

      <!-- Other Options -->
      <field name="IPRestriction">ANY</field>
      <field name="TransportRestriction">ANY</field>
      <field name="SecondaryRegistrar"></field>
      <field name="IsBindToMS">1</field>
      <field name="UseIPInContact">0</field>
      <field name="CallerIDIn">1</field>
      <field name="CalledNumberIn">2</field>

    <codecs>
      <codec rfcname="pcmu"/>
      <codec rfcname="pcma"/>
      <codec rfcname="g729"/>
    </codecs>

      <!--Source Identification - Use Default PBX Internal Source Identification-->
      <field status="readonly" name="MatchStrategy">0</field>
      <field status="readonly" name="Source" parameter="ContactHost" custom="">$GWHostPort</field>

      <!-- Gateway / Provider Inbound Parameters -->
      <field name="ParameterIn" custom="" parameter="ToUserPart">$CalledNum</field>
      <field name="ParameterIn" custom="" parameter="FromUserPart">$CallerName</field>
      <field name="ParameterIn" custom="" parameter="FromUserPart">$CallerNum</field>

      <!-- Gateway / Provider Outbound Parameters.
           From and Remote-Party-ID carry the original caller ($OriginatorCallerId), not the PBX's own
           outbound number, so Voice AI sees the real caller on calls your 3CX forwards to it. -->
      <field name="ParameterOut" custom="" parameter="RequestLineURIUser">$CalledNum</field>
      <field name="ParameterOut" custom="" parameter="RequestLineURIHost">$GWHostPort</field>
      <field name="ParameterOut" custom="" parameter="ContactUser">$OutboundCallerId</field>
      <field name="ParameterOut" custom="" parameter="ContactHost">$ContactURI</field>
      <field name="ParameterOut" custom="" parameter="ToDisplayName">$CalledName</field>
      <field name="ParameterOut" custom="" parameter="ToUserPart">$CalledNum</field>
      <field name="ParameterOut" custom="" parameter="ToHostPart">$GWHostPort</field>
      <field name="ParameterOut" custom="" parameter="FromDisplayName">$OriginatorCallerId</field>
      <field name="ParameterOut" custom="" parameter="FromUserPart">$OriginatorCallerId</field>
      <field name="ParameterOut" custom="" parameter="FromHostPart">$GWHostPort</field>
      <field name="ParameterOut" custom="" parameter="RemotePartyIDCallingPartyDisplayName">$OriginatorCallerId</field>
      <field name="ParameterOut" custom="" parameter="RemotePartyIDCallingPartyUserPart">$OriginatorCallerId</field>
      <field name="ParameterOut" custom="" parameter="RemotePartyIDCallingPartyHostPart">$GWHostPort</field>
    </device>
</data>
</doc>
