Programadores

Integre chamadas traduzidas nos seus próprios sistemas

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.

Nesta página

Autenticação

Autenticar com uma chave API

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: GET /billing
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

Endpoints de integração

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

Fazer uma chamada traduzida

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.

POST /calls/originate
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"
  }'
201 Created
{
  "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: GET /calls
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: GET /twilio-numbers
curl https://b2b.owaa.ai/v1/b2b/admin/twilio-numbers \
  -H "Authorization: Bearer $API_KEY"
200 OK
[
  {
    "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: PUT /twilio-numbers/{id}/route
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

Encaminhe chamadas de entrada com um webhook assinado

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.

Corpo da solicitação

call.inbound
{
  "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.

response: connect
{ "action": "connect", "destination": "+34600000000", "caller_id": "+14165550101" }
response: reject
{ "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.

Node.js
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);
}
Python
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

Limites de taxa e respostas de erro

Os limites se aplicam por empresa, a cada minuto. Quando um é excedido, a API retorna 429 com um cabeçalho Retry-After.

  • 600 solicitações de leitura por minuto
  • 120 solicitações de escrita por minuto
  • 60 downloads de gravação por minuto
  • 401Chave de API ausente ou inválida.
  • 402Saldo insuficiente para iniciar a chamada.
  • 409Nenhum ID de chamador utilizável, ou nenhuma conta Twilio verificada conectada.
  • 422Twilio recusou a chamada, ou um ID de chamador que você nomeou não é um que você possui.
  • 429Limite de taxa excedido: aguarde o tempo em Retry-After. Também devolvido a um endereço que está temporariamente bloqueado após repetidas chaves inválidas.

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

Permita que assistentes de IA trabalhem com sua conta

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.

Disponível mediante solicitação

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.

Conectar

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.

Configuração do cliente

Adicione o servidor a qualquer cliente MCP que suporte servidores HTTP remotos e substitua o espaço reservado pela sua chave.

mcp.json
{
  "mcpServers": {
    "owaa": {
      "type": "http",
      "url": "https://mcp.owaa.ai/business",
      "headers": { "Authorization": "Bearer <your-api-key>" }
    }
  }
}
Claude Code
claude mcp add --transport http owaa https://mcp.owaa.ai/business \
  --header "Authorization: Bearer <your-api-key>"

Ferramentas

  • list_languagesListar os idiomas disponíveis para chamadas traduzidas.
  • check_call_costEstimar o custo de uma chamada antes de ser efetuada.
  • get_callObter uma chamada, com o seu estado e custo.
  • list_recent_activityListar a atividade recente na sua conta.
  • place_translated_callFazer uma chamada traduzida: toca o telefone do seu operador, depois o da outra parte. Gasta o seu saldo.
  • delegate_call_taskEntregar uma tarefa telefónica ao chamador de IA da Owaa, com um objetivo e os campos a recolher. Disponível quando ativado para o seu negócio.
  • get_taskVerificar o progresso e o resultado de uma tarefa delegada.
  • cancel_taskCancelar uma tarefa delegada.

Escopos

  • activity:readConsultar idiomas, custos, chamadas e tarefas. Sempre concedido.
  • calls:translateFazer chamadas traduzidas.
  • tasks:delegateDelegar tarefas telefónicas.

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

Como o acesso é protegido

Criptografado em trânsito

Todo o tráfego da API e MCP usa TLS, com HSTS.

Chaves API

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.

Limites de taxa

600 leituras, 120 escritas e 60 downloads de gravação por minuto por negócio, com 429 e Retry-After quando excedido.

Webhooks assinados

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.

Sua conta de operadora

As chamadas são executadas na sua própria conta Twilio, e as suas credenciais Twilio são criptografadas em repouso.

Autorização MCP

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.

Escopos separados

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.

Limites de gasto que um assistente não pode aumentar

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.

Listas de permissão

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.

Registo de auditoria

Cada chamada da ferramenta MCP é registada com o seu resultado e o cliente que a efetuou.

As transcrições são opcionais

As transcrições de chamadas estão desativadas por predefinição e são ativadas por empresa.

Obter acesso

Fale connosco sobre o acesso à API e MCP

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.

Abrir a consola
Documentação do programador Owaa — API comercial e servidor MCP