Criptografado em trânsito
Todo o tráfego da API e MCP usa TLS, com HSTS.
Programadores
Owaa for Business oferece uma API REST para fazer e rever chamadas traduzidas, um webhook assinado para encaminhamento de entrada e um servidor MCP que permite que assistentes de IA trabalhem com a sua conta sob limites que você controla.
Autenticação
Cada pedido transporta a sua chave como um token Bearer. Crie chaves na consola Owaa for Business. Uma chave é mostrada uma vez quando é criada, por isso armazene-a no seu gestor de segredos.
URL base
https://b2b.owaa.ai/v1/b2b/admin
curl https://b2b.owaa.ai/v1/b2b/admin/billing \
-H "Authorization: Bearer $API_KEY"Envie a chave no cabeçalho Authorization. As chaves não são aceites como parâmetro de consulta.
As chaves API só podem chamar os endpoints de integração listados nesta página e o servidor MCP. Gerir chaves API, membros da equipa, carregamentos de faturação, credenciais de operadora e limites de gastos requer uma sessão de consola iniciada.
Rode uma chave da consola (página de chaves API): a nova chave é mostrada uma vez e a antiga deixa de funcionar imediatamente.
Um pedido com uma chave em falta ou inválida retorna 401. Tentativas falhadas repetidas de um endereço são bloqueadas por um tempo.
API REST
Todos os caminhos são relativos ao URL base. As solicitações e respostas são JSON, exceto as gravações, que transmitem áudio.
POST/calls/originate
Inicie uma chamada traduzida entre o telefone do seu agente e uma parte remota, usando sua própria conta Twilio conectada.
GET/caller-id/preview?destination=
Teste um destino: mostra qual ID de chamador seria usado, para que problemas de ID de chamador apareçam antes de você discar.
GET/calls
Liste as pernas da chamada, as mais recentes primeiro. Filtre com limite (1 a 200) e status, e pagine com o cursor em next_cursor.
GET/calls/{id}
Busque uma única perna de chamada.
GET/calls/{id}/recording
Transmita a gravação de uma perna como áudio Opus. Escolha o lado com side=in ou side=out.
GET/billing
Leia seu saldo, taxa por minuto, minutos restantes e limite de saldo baixo.
GET/twilio-numbers
Liste seus números Twilio com seu ID, configurações de roteamento e status. Somente leitura: nenhuma credencial é retornada.
PUT/twilio-numbers/{id}/route
Defina o URL de roteamento de entrada e o destino de fallback para um dos seus números Twilio.
Exemplo
Envie o número do agente e o número da parte remota. Idiomas e IDs de chamador são opcionais, e campos desconhecidos são rejeitados.
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
}Uma solicitação bem-sucedida retorna 201 com os identificadores da chamada. Execute a pré-visualização do ID do chamador primeiro para evitar os casos 409.
Listar as pernas de chamadas recentes. Use o endpoint de faturação da mesma forma para ler o seu saldo.
curl "https://b2b.owaa.ai/v1/b2b/admin/calls?limit=20" \
-H "Authorization: Bearer $API_KEY"Para definir o roteamento, você precisa do ID do número. Encontre-o com GET /twilio-numbers, que lista seus números (mostrado aqui com os campos principais).
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"
}
]Em seguida, defina o roteamento de entrada para esse número com PUT /twilio-numbers/{id}/route: o URL que Owaa chama para cada chamada de entrada, o destino de fallback e, opcionalmente, o idioma do agente e uma dica de idioma para o chamador.
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"
}'Roteamento de entrada
Para cada chamada de entrada em um número roteado para seu URL, Owaa envia um POST e aguarda até três segundos. Se seu endpoint falhar, expirar ou retornar JSON inválido, a chamada vai para o destino de fallback que você configurou e o motivo é registrado.
{
"event": "call.inbound",
"call_id": "...",
"tenant_id": "...",
"from": "+14165550100",
"to": "+14165550101",
"twilio_call_sid": "...",
"received_at": "..."
}Responda com 200 e conecte ou rejeite. Um caller_id que você não possui é ignorado.
{ "action": "connect", "destination": "+34600000000", "caller_id": "+14165550101" }{ "action": "reject", "reason": "closed" }X-Owaa-Signature Cada solicitação carrega um cabeçalho X-Owaa-Signature no formato t=<segundos unix>,v1=<hex>. O valor v1 é o HMAC-SHA256 do timestamp, um ponto e o corpo da solicitação bruto, com chave secreta de roteamento. Verifique-o em relação ao corpo bruto e rejeite timestamps com mais de cinco minutos.
Sua chave secreta de roteamento é mostrada uma vez na página de Roteamento do console.
A janela de tempo limita as repetições a cinco minutos. Para bloquear repetições dentro dela, lembre-se também do call_id de cada pedido que já tratou.
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", ""))Limites e erros
Os limites se aplicam por empresa, a cada minuto. Quando um é excedido, a API retorna 429 com um cabeçalho Retry-After.
A API não possui chave de idempotência. Se uma solicitação para fazer uma chamada expirar, liste suas chamadas recentes antes de enviá-la novamente.
Servidor MCP
O servidor MCP da Owaa permite que assistentes de IA compatíveis com MCP consultem custos de chamadas, façam chamadas traduzidas e revisem a atividade de sua empresa, dentro dos limites de gastos que você definir.
O servidor MCP está disponível mediante solicitação. Entre em contato conosco para ativá-lo para sua empresa.
Endpoint
https://mcp.owaa.ai/business
Transporte HTTP transmissível.
Com uma chave API: envie-a como um token Bearer no cabeçalho de Autorização.
Com OAuth: clientes que suportam OAuth 2.1 com PKCE podem iniciar sessão e ter acesso concedido a partir da consola. Cada concessão pode ser revogada.
Adicione o servidor a qualquer cliente MCP que suporte servidores HTTP remotos e substitua o espaço reservado pela sua chave.
{
"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>"Os âmbitos para uma chave API são definidos na consola. Uma ferramenta fora dos âmbitos da chave devolve scope_not_granted.
O servidor instrui os assistentes a verificar o custo e a confirmar com o utilizador antes de qualquer chamada que gaste dinheiro.
As ferramentas retornam erros como um código e uma mensagem, por exemplo, insufficient_balance, country_not_allowed ou rate_limited. Não tente novamente outcome_unknown cegamente: verifique a chamada primeiro.
Segurança
Todo o tráfego da API e MCP usa TLS, com HSTS.
As chaves são segredos aleatórios longos, mostrados uma vez quando criados e armazenados apenas como um hash. Revogue ou gire uma chave a qualquer momento e a antiga para de funcionar imediatamente. Tentativas falhas repetidas são bloqueadas.
600 leituras, 120 escritas e 60 downloads de gravação por minuto por negócio, com 429 e Retry-After quando excedido.
Os pedidos de roteamento de entrada são assinados com HMAC-SHA256 e um carimbo de data/hora. Verifique a assinatura e rejeite pedidos com mais de cinco minutos. Uma resposta não pode apresentar um ID de chamador que o seu negócio não possui.
As chamadas são executadas na sua própria conta Twilio, e as suas credenciais Twilio são criptografadas em repouso.
OAuth 2.1 com PKCE. Os tokens são vinculados ao recurso MCP, os tokens de acesso têm vida curta, os tokens de atualização giram a cada uso, e um token de atualização reproduzido revoga a concessão. Apenas resumos de tokens são armazenados, e as concessões podem ser revogadas a partir da consola.
Leitura e gasto são escopos separados. Um assistente precisa de calls:translate ou tasks:delegate antes de poder fazer uma chamada ou iniciar uma tarefa.
Cada chave tem um limite de gasto diário e o seu negócio tem um teto diário, ambos com padrões conservadores e um máximo da plataforma. Apenas uma sessão de consola autenticada pode alterá-los, nunca uma chave API ou um cliente de IA.
As chamadas são limitadas a uma lista de permissões de países, e pode restringir os números de telefone de operadoras que um assistente pode ligar. Ambos são geridos fora da ligação MCP.
Cada chamada da ferramenta MCP é registada com o seu resultado e o cliente que a efetuou.
As transcrições de chamadas estão desativadas por predefinição e são ativadas por empresa.
Obter acesso
Crie chaves de API na consola assim que a sua empresa estiver configurada. Para ativar o servidor MCP, ou para discutir uma integração, contacte-nos.