Cifrado en tránsito
Todo el tráfico de API y MCP utiliza TLS, con HSTS.
Desarrolladores
Owaa for Business ofrece una API REST para realizar y revisar llamadas traducidas, un webhook firmado para el enrutamiento de llamadas entrantes y un servidor MCP que permite a los asistentes de IA trabajar con tu cuenta bajo límites que tú controlas.
Autenticación
Cada solicitud lleva tu clave como un token Bearer. Crea claves en la consola de Owaa for Business. Una clave se muestra una vez cuando se crea, así que guárdala en tu gestor de secretos.
URL base
https://b2b.owaa.ai/v1/b2b/admin
curl https://b2b.owaa.ai/v1/b2b/admin/billing \
-H "Authorization: Bearer $API_KEY"Envía la clave en el encabezado Authorization. Las claves no se aceptan como parámetro de consulta.
Las claves API solo pueden llamar a los puntos finales de integración que se enumeran en esta página y al servidor MCP. La gestión de claves API, miembros del equipo, recargas de facturación, credenciales de operador y límites de gasto requiere una sesión de consola iniciada.
Rota una clave desde la consola (página de claves API): la nueva clave se muestra una vez y la antigua deja de funcionar inmediatamente.
Una solicitud con una clave faltante o inválida devuelve 401. Los intentos fallidos repetidos desde una dirección se bloquean por un tiempo.
API REST
Todas las rutas son relativas a la URL base. Las solicitudes y respuestas son JSON, excepto las grabaciones, que transmiten audio.
POST/calls/originate
Inicie una llamada traducida entre el teléfono de su agente y un tercero, utilizando su propia cuenta de Twilio conectada.
GET/caller-id/preview?destination=
Realice una prueba en seco de un destino: muestra qué identificador de llamadas se usaría, para que los problemas de identificador de llamadas salgan a la luz antes de marcar.
GET/calls
Liste las etapas de la llamada, las más recientes primero. Filtre con límite (1 a 200) y estado, y pagine con el cursor en next_cursor.
GET/calls/{id}
Obtenga una sola etapa de la llamada.
GET/calls/{id}/recording
Transmita la grabación de una etapa como audio Opus. Elija el lado con side=in o side=out.
GET/billing
Lea su saldo, tarifa por minuto, minutos restantes y umbral de saldo bajo.
GET/twilio-numbers
Liste sus números de Twilio con su ID, configuración de enrutamiento y estado. Solo lectura: no se devuelven credenciales.
PUT/twilio-numbers/{id}/route
Establezca la URL de enrutamiento de entrada y el destino de respaldo para uno de sus números de Twilio.
Ejemplo
Envíe el número del agente y el número del tercero. Los idiomas y los identificadores de llamadas son opcionales, y los campos desconocidos son rechazados.
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
}Una solicitud exitosa devuelve 201 con los identificadores de la llamada. Ejecute primero la vista previa del identificador de llamadas para evitar los casos 409.
Listar las etapas de llamadas recientes. Utilice el punto final de facturación de la misma manera para leer su saldo.
curl "https://b2b.owaa.ai/v1/b2b/admin/calls?limit=20" \
-H "Authorization: Bearer $API_KEY"Para configurar el enrutamiento, necesita el ID del número. Encuéntrelo con GET /twilio-numbers, que enumera sus números (mostrados aquí con los campos principales).
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"
}
]Luego, configure el enrutamiento de entrada para ese número con PUT /twilio-numbers/{id}/route: la URL a la que Owaa llama para cada llamada entrante, el destino de respaldo y, opcionalmente, el idioma del agente y una sugerencia de idioma para la persona que llama.
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"
}'Enrutamiento de entrada
Para cada llamada entrante en un número enrutado a su URL, Owaa envía un POST y espera hasta tres segundos. Si su punto de conexión falla, agota el tiempo de espera o devuelve JSON no válido, la llamada va al destino de respaldo que configuró y se registra el motivo.
{
"event": "call.inbound",
"call_id": "...",
"tenant_id": "...",
"from": "+14165550100",
"to": "+14165550101",
"twilio_call_sid": "...",
"received_at": "..."
}Responda con 200 y conecte o rechace. Un caller_id que no le pertenece es ignorado.
{ "action": "connect", "destination": "+34600000000", "caller_id": "+14165550101" }{ "action": "reject", "reason": "closed" }X-Owaa-Signature Cada solicitud lleva un encabezado X-Owaa-Signature en el formato t=<segundos unix>,v1=<hex>. El valor v1 es el HMAC-SHA256 de la marca de tiempo, un punto y el cuerpo de la solicitud sin procesar, con la clave de su secreto de enrutamiento. Verifíquelo contra el cuerpo sin procesar y rechace las marcas de tiempo anteriores a cinco minutos.
Su secreto de enrutamiento se muestra una vez en la página de Enrutamiento de la consola.
La ventana de tiempo limita las repeticiones a cinco minutos. Para bloquear las repeticiones dentro de ella, recuerde también el call_id de cada solicitud que ya haya manejado.
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", ""))Límites y errores
Los límites se aplican por negocio, cada minuto. Cuando se excede uno, la API devuelve 429 con un encabezado Retry-After.
La API no tiene clave de idempotencia. Si una solicitud para realizar una llamada agota el tiempo de espera, liste sus llamadas recientes antes de enviarla de nuevo.
Servidor MCP
El servidor MCP de Owaa permite a los asistentes de IA compatibles con MCP buscar costos de llamadas, realizar llamadas traducidas y revisar la actividad de su negocio, dentro de los límites de gasto que usted establezca.
El servidor MCP está disponible bajo petición. Contáctenos para habilitarlo para su negocio.
Punto de conexión
https://mcp.owaa.ai/business
Transporte HTTP en streaming.
Con una clave API: envíela como un token Bearer en el encabezado de autorización.
Con OAuth: los clientes que admiten OAuth 2.1 con PKCE pueden iniciar sesión y se les concede acceso desde la consola. Cada concesión puede ser revocada.
Añada el servidor a cualquier cliente MCP que admita servidores HTTP remotos y reemplace el marcador de posición con su clave.
{
"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>"Los alcances de una clave API se configuran en la consola. Una herramienta fuera de los alcances de la clave devuelve scope_not_granted.
El servidor instruye a los asistentes para que comprueben el coste y confirmen con el usuario antes de cualquier llamada que implique un gasto.
Las herramientas devuelven errores como un código y un mensaje, por ejemplo, insufficient_balance, country_not_allowed o rate_limited. No reintente outcome_unknown a ciegas: compruebe primero la llamada.
Seguridad
Todo el tráfico de API y MCP utiliza TLS, con HSTS.
Las claves son secretos aleatorios largos, mostrados una vez al crearse y almacenados solo como un hash. Revoque o rote una clave en cualquier momento y la antigua dejará de funcionar inmediatamente. Los intentos fallidos repetidos se bloquean.
600 lecturas, 120 escrituras y 60 descargas de grabaciones por minuto por negocio, con 429 y Retry-After cuando se exceden.
Las solicitudes de enrutamiento entrantes se firman con HMAC-SHA256 y una marca de tiempo. Verifique la firma y rechace las solicitudes con más de cinco minutos de antigüedad. Una respuesta no puede presentar un identificador de llamada que su negocio no posea.
Las llamadas se ejecutan en su propia cuenta de Twilio, y sus credenciales de Twilio están cifradas en reposo.
OAuth 2.1 con PKCE. Los tokens están vinculados al recurso MCP, los tokens de acceso tienen una vida útil corta, los tokens de actualización rotan en cada uso y un token de actualización reproducido revoca la concesión. Solo se almacenan los resúmenes de los tokens y las concesiones pueden revocarse desde la consola.
La lectura y el gasto son ámbitos separados. Un asistente necesita calls:translate o tasks:delegate antes de poder realizar una llamada o iniciar una tarea.
Cada clave tiene un límite de gasto diario y su negocio tiene un límite máximo diario, ambos con valores predeterminados conservadores y un máximo de plataforma. Solo una sesión de consola iniciada puede cambiarlos, nunca una clave API o un cliente de IA.
Las llamadas están limitadas a una lista de países permitidos, y puedes restringir a qué números de teléfono de operador puede llamar un asistente. Ambos se gestionan fuera de la conexión MCP.
Cada llamada a la herramienta MCP se registra con su resultado y el cliente que la realizó.
Las transcripciones de llamadas están desactivadas por defecto y se activan por negocio.
Obtener acceso
Crea claves API en la consola una vez que tu negocio esté configurado. Para habilitar el servidor MCP o para discutir una integración, contáctanos.