传输中加密
所有 API 和 MCP 流量都使用 TLS 和 HSTS。
开发者
Owaa for Business 提供 REST API 用于拨打和查看翻译电话,提供签名 webhook 用于来电路由,以及提供 MCP 服务器,让 AI 助手在您控制的限额下使用您的账户。
身份验证
每个请求都将您的密钥作为 Bearer 令牌携带。在 Owaa for Business 控制台中创建密钥。密钥在创建时显示一次,因此请将其存储在您的密钥管理器中。
基本 URL
https://b2b.owaa.ai/v1/b2b/admin
curl https://b2b.owaa.ai/v1/b2b/admin/billing \
-H "Authorization: Bearer $API_KEY"在 Authorization 标头中发送密钥。密钥不接受作为查询参数。
API 密钥只能调用此页面上列出的集成端点和 MCP 服务器。管理 API 密钥、团队成员、账单充值、运营商凭据和支出限额需要登录控制台会话。
从控制台(API 密钥页面)轮换密钥:新密钥显示一次,旧密钥立即停止工作。
缺少或无效密钥的请求返回 401。来自一个地址的重复失败尝试将被锁定一段时间。
REST API
所有路径都相对于基本 URL。请求和响应均为 JSON 格式,录音除外,录音以音频流形式传输。
POST/calls/originate
使用您自己的 Twilio 账户,在您的座席电话和远端之间发起翻译通话。
GET/caller-id/preview?destination=
试运行目的地:显示将使用的主叫号码,以便在拨号前发现主叫号码问题。
GET/calls
列出通话记录,最新通话优先。使用 limit(1 到 200)和 status 进行筛选,并使用 next_cursor 中的游标进行分页。
GET/calls/{id}
获取单个通话记录。
GET/calls/{id}/recording
将通话记录流式传输为 Opus 音频。使用 side=in 或 side=out 选择通话方。
GET/billing
查看您的余额、每分钟费率、剩余分钟数和低余额阈值。
GET/twilio-numbers
列出您的 Twilio 号码及其 ID、路由设置和状态。只读:不返回凭据。
PUT/twilio-numbers/{id}/route
为您其中一个 Twilio 号码设置入站路由 URL 和备用目的地。
示例
发送座席号码和远端号码。语言和主叫号码是可选的,未知字段将被拒绝。
curl -X POST https://b2b.owaa.ai/v1/b2b/admin/calls/originate \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_number": "+14165550100",
"far_number": "+34600000000",
"agent_language": "en",
"far_language": "es"
}'{
"bridge_id": "...",
"agent_call_sid": "...",
"far_call_sid": "...",
"agent_caller_id": "+14165550101",
"far_caller_id": "+14165550101",
"agent_must_confirm": false
}成功的请求返回 201 和通话标识符。请先运行主叫号码预览,以避免 409 错误。
列出最近的通话记录。以相同方式使用账单端点来读取您的余额。
curl "https://b2b.owaa.ai/v1/b2b/admin/calls?limit=20" \
-H "Authorization: Bearer $API_KEY"要设置路由,您需要号码的 ID。使用 GET /twilio-numbers 查找,它会列出您的号码(此处显示主要字段)。
curl https://b2b.owaa.ai/v1/b2b/admin/twilio-numbers \
-H "Authorization: Bearer $API_KEY"[
{
"id": "<number_id>",
"phone_number_e164": "+14165550101",
"friendly_name": "Support line",
"country_code": "CA",
"voice_enabled": true,
"verified": true,
"routes_to_owaa": true,
"inbound_destination_e164": "+34600000000",
"inbound_routing_url": "https://example.com/owaa/route",
"agent_language": "es",
"caller_language_hint": "en"
}
]然后使用 PUT /twilio-numbers/{id}/route 设置该号码的呼入路由:Owaa 为每个呼入电话调用的 URL、备用目的地,以及可选的座席语言和呼叫者语言提示。
curl -X PUT https://b2b.owaa.ai/v1/b2b/admin/twilio-numbers/<number_id>/route \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"routing_url": "https://example.com/owaa/route",
"destination_e164": "+34600000000",
"agent_language": "es",
"caller_language_hint": "en"
}'入站路由
对于路由到您的 URL 的每个入站呼叫,Owaa 会发送一个 POST 请求并等待最多三秒。如果您的端点失败、超时或返回无效 JSON,则呼叫将转到您配置的备用目的地,并记录原因。
{
"event": "call.inbound",
"call_id": "...",
"tenant_id": "...",
"from": "+14165550100",
"to": "+14165550101",
"twilio_call_sid": "...",
"received_at": "..."
}回复 200 并连接或拒绝。您不拥有的 caller_id 将被忽略。
{ "action": "connect", "destination": "+34600000000", "caller_id": "+14165550101" }{ "action": "reject", "reason": "closed" }X-Owaa-Signature 每个请求都带有一个 X-Owaa-Signature 标头,格式为 t=<unix seconds>,v1=<hex>。v1 值是时间戳、一个点和原始请求正文的 HMAC-SHA256,使用您的路由密钥进行加密。对照原始正文进行验证,并拒绝早于五分钟的时间戳。
您的路由密钥在控制台的“路由”页面上显示一次。
时间戳窗口将重放限制为五分钟。要在其中阻止重放,请记住您已处理的每个请求的 call_id。
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: the exact bytes received, as a string or Buffer.
// Never re-serialise parsed JSON: that changes the bytes and the signature.
export function verifyOwaaSignature(rawBody, header, secret) {
const parts = Object.fromEntries(
String(header ?? "").split(",").map((p) => p.split("=")),
);
const t = parts.t ?? "";
if (!/^\d+$/.test(t) || !(Math.abs(Date.now() / 1000 - Number(t)) <= 300)) return false;
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
const given = Buffer.from(parts.v1 ?? "", "hex");
return given.length === expected.length && timingSafeEqual(given, expected);
}import hashlib
import hmac
import time
def verify_owaa_signature(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in (header or "").split(",") if "=" in p)
try:
t = int(parts["t"])
except (KeyError, ValueError):
return False
if abs(time.time() - t) > 300:
return False
signed = f"{t}.".encode() + raw_body
expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts.get("v1", ""))限制和错误
限制适用于每个企业,每分钟。当超出限制时,API 返回 429 并带有 Retry-After 标头。
API 没有幂等性密钥。如果发起通话的请求超时,请在再次发送之前列出您最近的通话。
MCP 服务器
Owaa MCP 服务器允许兼容 MCP 的 AI 助手在您设定的支出限额内,为您的企业查询通话费用、发起翻译通话和查看活动。
MCP 服务器按需提供。请联系我们为您的企业启用它。
端点
https://mcp.owaa.ai/business
可流式传输的 HTTP 传输。
使用 API 密钥:将其作为 Bearer 令牌发送到 Authorization 标头中。
使用 OAuth:支持 OAuth 2.1 和 PKCE 的客户端可以登录并从控制台获得访问权限。每个授权都可以撤销。
将服务器添加到任何支持远程 HTTP 服务器的 MCP 客户端,并将占位符替换为您的密钥。
{
"mcpServers": {
"owaa": {
"type": "http",
"url": "https://mcp.owaa.ai/business",
"headers": { "Authorization": "Bearer <your-api-key>" }
}
}
}claude mcp add --transport http owaa https://mcp.owaa.ai/business \
--header "Authorization: Bearer <your-api-key>"API 密钥的范围在控制台中设置。超出密钥范围的工具将返回 scope_not_granted。
服务器指示助理在任何需要付费的通话前检查费用并与用户确认。
工具以代码和消息的形式返回错误,例如 insufficient_balance、country_not_allowed 或 rate_limited。不要盲目重试 outcome_unknown:请先检查通话。
安全
所有 API 和 MCP 流量都使用 TLS 和 HSTS。
密钥是长随机密钥,创建时显示一次,并仅以哈希形式存储。随时撤销或轮换密钥,旧密钥会立即停止工作。重复失败的尝试会被锁定。
每个企业每分钟 600 次读取、120 次写入和 60 次录音下载,超出时返回 429 和 Retry-After。
入站路由请求使用 HMAC-SHA256 和时间戳签名。验证签名并拒绝超过五分钟的请求。回复不能显示您的企业不拥有的主叫号码。
通话在您自己的 Twilio 账户上运行,您的 Twilio 凭据在静态时加密。
OAuth 2.1 和 PKCE。令牌绑定到 MCP 资源,访问令牌是短期的,刷新令牌在每次使用时轮换,重放的刷新令牌会撤销授权。只存储令牌的摘要,并且可以从控制台撤销授权。
读取和消费是独立的范围。助理需要 calls:translate 或 tasks:delegate 才能拨打电话或开始任务。
每个密钥都有每日消费限额,您的企业也有每日上限,两者都有保守的默认值和平台最大值。只有登录的控制台会话才能更改它们,API 密钥或 AI 客户端永远不能。
呼叫仅限于国家/地区允许列表,您可以限制助理可以拨打的运营商电话号码。这两项都在 MCP 连接之外进行管理。
每次 MCP 工具呼叫都会记录其结果和发出呼叫的客户端。
呼叫转录默认关闭,并按业务启用。
获取访问权限
设置业务后,在控制台中创建 API 密钥。要启用 MCP 服务器或讨论集成,请联系我们。