Зашифровано при передаче
Весь трафик API и MCP использует TLS с HSTS.
Разработчикам
Owaa for Business предлагает REST API для совершения и просмотра звонков с переводом, подписанный веб-хук для маршрутизации входящих звонков и MCP-сервер, который позволяет ИИ-помощникам работать с вашей учетной записью в рамках контролируемых вами лимитов.
Аутентификация
Каждый запрос содержит ваш ключ в качестве токена 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
Перечислить сегменты звонков, начиная с самых новых. Фильтруйте по лимиту (от 1 до 200) и статусу, а также используйте курсор в next_cursor для пагинации.
GET/calls/{id}
Получить один сегмент звонка.
GET/calls/{id}/recording
Передавать запись сегмента в виде аудио Opus. Выберите сторону с side=in или side=out.
GET/billing
Прочитайте ваш баланс, тариф за минуту, оставшиеся минуты и порог низкого баланса.
GET/twilio-numbers
Перечислите свои номера Twilio с их идентификатором, настройками маршрутизации и статусом. Только для чтения: учетные данные не возвращаются.
PUT/twilio-numbers/{id}/route
Установите URL для входящей маршрутизации и запасное назначение для одного из ваших номеров Twilio.
Пример
Отправьте номер агента и номер удаленной стороны. Языки и идентификаторы вызывающего абонента необязательны, а неизвестные поля отклоняются.
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"Чтобы настроить маршрутизацию, вам нужен идентификатор номера. Найдите его с помощью 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: URL-адрес, который Owaa вызывает для каждого входящего звонка, запасное направление и, при необходимости, язык агента и подсказку языка для звонящего.
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 и подключите или отклоните. Идентификатор вызывающего абонента, которым вы не владеете, игнорируется.
{ "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 ИИ-помощникам проверять стоимость звонков, совершать переведенные звонки и просматривать активность для вашего бизнеса в пределах установленных вами лимитов расходов.
Сервер MCP доступен по запросу. Свяжитесь с нами, чтобы включить его для вашего бизнеса.
Конечная точка
https://mcp.owaa.ai/business
Потоковый HTTP-транспорт.
С помощью ключа API: отправьте его как токен Bearer в заголовке Authorization.
С помощью OAuth: клиенты, поддерживающие OAuth 2.1 с PKCE, могут войти в систему и получить доступ из консоли. Каждое разрешение может быть отозвано.
Добавьте сервер к любому клиенту MCP, который поддерживает удаленные HTTP-серверы, и замените заполнитель своим ключом.
{
"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 или клиент ИИ.
Звонки ограничены списком разрешенных стран, и вы можете ограничить, на какие номера телефонов операторов может звонить помощник. Оба параметра управляются вне соединения MCP.
Каждый вызов инструмента MCP записывается с его результатом и клиентом, который его совершил.
Стенограммы звонков по умолчанию отключены и включаются для каждого бизнеса.
Получить доступ
Создавайте ключи API в консоли после настройки вашего бизнеса. Чтобы включить сервер MCP или обсудить интеграцию, свяжитесь с нами.