**Vapi本身不是电信运营商,它不直接管理美国电话号码资源,也不直接提供PSTN接入。** 要让Vapi的AI语音代理拨打或接听美国电话,唯一的路径是**通过BYO SIP中继(Bring Your Own SIP Trunk)** ,将Vapi与一家拥有美国PSTN接入能力的SIP中继提供商对接。
这意味着,配置的核心不是“在Vapi里填个号码”,而是**打通Vapi与你所选SIP中继提供商之间的SIP信令和媒体流**。本文以Telnyx和Twilio两个主流提供商为例,拆解从网络准备到测试上线的完整流程。
Vapi的SIP信令和媒体流对网络有明确的allowlist要求。以美国区域为例:
| 参数 | 美国区域值 |
|---|---|
| SIP host | sip.vapi.ai |
| 信令IP地址 | 44.229.228.186/32、44.238.177.138/32 |
| RTP媒体行为 | 动态媒体IP,允许UDP端口40000-60000 |
数据来源:Vapi官方SIP Trunking文档
**关键提醒**:美国区域的RTP媒体使用**动态IP**,不能通过固定IP白名单放行,必须**放行UDP端口范围40000-60000**。如果你的SIP中继提供商或防火墙只支持静态IP放行,会出现“信令通了但没声音”的单通问题。
**Vapi要求美国和加拿大方向的呼叫必须具备STIR/SHAKEN认证。** 但认证本身不由Vapi签发——它“住在”提供电话号码的底层运营商那里。Vapi将STIR/SHAKEN的责任委托给你选择的SIP中继提供商。
这意味着,**SIP中继提供商是否支持A级认证,直接决定你的呼叫是否会被标记为垃圾或拦截**。Telnyx和Twilio(Elastic SIP)都在已知支持A级认证的运营商列表中。
Vapi的AI语音代理以**Assistant**为单位。在配置SIP中继之前,你需要至少有一个配置好的Assistant(包含问候语、系统提示词、语音和模型设置),后续将电话号码关联到这个Assistant上,来电或去电才会由它处理。
这是整个配置的枢纽。Vapi通过`credential`对象“记住”如何连接到你的SIP中继提供商。
使用Vapi的`POST /credential`接口,类型设为`byo-sip-trunk`。以下以Telnyx为例(`sip.telnyx.com`作为网关):
```bash
curl -X POST "https://www.lanlansms.com/api.vapi.ai/credential" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_VAPI_PRIVATE_KEY" \
-d '{
"provider": "byo-sip-trunk",
"name": "Telnyx US Trunk",
"gateways": [{
"ip": "sip.telnyx.com",
"inboundEnabled": true
}],
"outboundLeadingPlusEnabled": true,
"outboundAuthenticationPlan": {
"authUsername": "YOUR_SIP_USERNAME",
"authPassword": "YOUR_SIP_PASSWORD"
}
}'
```
保存响应中的 **`credentialId`**,下一步关联号码和配置提供商侧路由都要用到它。
Telnyx的官方文档特别指出:**当`inboundEnabled`为`true`时,gateway的`ip`字段必须使用IP地址,不能使用`sip.telnyx.com`这样的域名**。如果需要启用入站,gateway应填写Telnyx为你的中继分配的**信令IP**,而不是FQDN。这是一个容易踩坑的地方,直接决定入站呼叫能否到达Vapi。
在Vapi中创建一个`phone-number`资源,将其与你从SIP中继提供商购买的DID绑定到上述`credentialId`:
```bash
curl -X POST "https://www.lanlansms.com/api.vapi.ai/phone-number" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_VAPI_PRIVATE_KEY" \
-d '{
"provider": "byo-phone-number",
"name": "US PSTN Number",
"number": "15551234567",
"credentialId": "YOUR_CREDENTIAL_ID"
}'
```
保存返回的 **`phoneNumberId`**,测试呼叫时需要用到。
Vapi侧的Credential只是“告诉Vapi往哪里连”。真正让呼叫到达Vapi的,是提供商侧的SIP中继路由配置。
| 配置项 | 值 |
|---|---|
| SIP中继类型 | FQDN |
| FQDN | sip.vapi.ai(美国区域) |
| 端口 | 5060(默认) |
| 入站路由 | 将号码的translated number设置为 sip:<unique-id>@sip.vapi.ai |
| 转接支持 | 需要在Telnyx中启用SIP REFER,否则Vapi的转接功能会在转接后掉线 |
Telnyx侧的关键动作是:将Telnyx号码分配到SIP中继,并将该号码的“translated number”指向Vapi的SIP URI格式。
Twilio的Elastic SIP Trunk配置略有不同:
**出站(Twilio → Vapi)** :在Twilio的Termination设置中,**whitelist Vapi的信令IP**(`44.229.228.186/32`和`44.238.177.138/32`),并将号码分配到该Elastic SIP Trunk。
**入站(Vapi → Twilio)** :在Twilio的Origination设置中,添加Vapi的SIP URI作为来源:
```
sip:YOUR_PHONE_NUMBER@
```
如果需要TLS,端口改为`5061`并加上`;transport=tls`。
| 配置维度 | Telnyx | Twilio |
|---|---|---|
| 连接方式 | FQDN指向sip.vapi.ai | Elastic SIP Trunk |
| Vapi → 提供商 | 号码translated number设为Vapi SIP URI | Origination URI设为Vapi SIP URI |
| 提供商 → Vapi | Telnyx中继FQDN指向Vapi | Whitelist Vapi信令IP |
| 转接支持 | 必须启用SIP REFER | 按需配置 |
通过Vapi Dashboard或API发起一通呼叫,`assistantId`使用你配置好的Assistant,`phoneNumberId`使用上一步返回的ID,`customer.number`填入一个可接收测试呼叫的美国号码。
从外部电话拨打你的DID。如果无法接通,按以下顺序排查:
| 问题现象 | 优先检查项 |
|---|---|
| 401 Unauthorized | Vapi的全部信令IP是否已在提供商侧完整whitelist。Vapi文档明确警告,遗漏任何一个信令IP都会导致401错误 |
| 信令通了但无声音 | 提供商防火墙是否放行UDP 40000-60000(美国RTP动态端口) |
| 入站完全不到Vapi | Telnyx中继的FQDN是否为sip.vapi.ai;Twilio的Origination URI格式是否正确;Telnyx入站gateway是否误用了域名而非IP |
| 转接后掉线 | 提供商侧是否启用了SIP REFER |
SIP中继配通,不等于呼叫“合规”。Vapi明确要求美国/加拿大呼叫具备STIR/SHAKEN认证,但**认证等级由你的SIP中继提供商决定**。
**A级认证(Full Attestation)意味着提供商知道客户是谁,并验证了客户有权使用该主叫号码。** C级呼叫在几天内会被标记为“Spam Likely”,接通率断崖式下跌。因此,在选择SIP中继提供商时,**“是否支持A级认证”应当作为与“价格”同等重要的选型标准**,而非配置完成后的补课项。
**一句话总结**:Vapi负责AI对话,SIP中继提供商负责PSTN接入和呼叫认证。两者之间的SIP中继配置解决“能不能通”,STIR/SHAKEN A级认证解决“通了之后会不会被当成垃圾”。两条线必须同时成立,美国PSTN接入才算真正可用。