Skip to content

Integrador OMNI — API para ERPs e sistemas ​

Onde fica: Integrador OMNI › Loja de Plugins (integrações) e a tela de chaves de API do administrador · API em /api/webservice/

O OMNI oferece três coisas a outros sistemas: uma API de envio de mensagens (WhatsApp oficial) com webhooks assinados, as integrações com ERPs (Integrador ISP, IXC, SGP e HubSoft) e o Canal Integrador, por onde os sistemas da casa abrem chamados de suporte.

Antes de começar ​

  • A API de envio exige que a empresa tenha ao menos uma instância de WhatsApp API Oficial conectada.
  • As chaves são de uma conta de serviço (um usuário que não entra pelo painel, só chama a API). Quem cria é o administrador da empresa.

Autenticação ​

Chave da API externa (io_live_…) ​

Envie no cabeçalho X-API-Key. A chave é criada pelo administrador: primeiro uma conta de serviço, depois a chave dela, com os escopos desejados. A chave completa só aparece uma vez, na criação.

EscopoLibera
messages.sendEnviar mensagens e abrir atendimento com modelo.
messages.readConsultar o estado de uma mensagem enviada.
tecnicoApoio do técnico (já vem ligado com o Integrador ISP).

Os escopos de uma chave existente podem ser trocados sem trocar o token. Cada chave tem um limite de chamadas por minuto (120 por padrão); o excesso responde 429.

Chave pessoal (nxa_…) ​

A tela do usuário gera chaves pessoais, enviadas em Authorization: Bearer. São as usadas pelos sistemas da casa que chamam o OMNI (por exemplo, no Canal Integrador).

Recursos — mensagens (prefixo /api/webservice) ​

O envio é assíncrono: a chamada enfileira a mensagem e responde 202; o resultado chega por webhook ou por consulta.

Método e rotaEscopoPara quê
POST /messages/textmessages.sendMensagem de texto. Campos: destino (telefone), texto (até 4.096 caracteres), integration_row_id (opcional), webhook_callback_url, send_after.
POST /messages/templatemessages.sendMensagem com modelo aprovado. Campos: destino, template_id, variaveis.
POST /messages/mediamessages.sendImagem, vídeo, áudio ou documento. Campos: destino, media_type (image, video, audio, document), url, caption, filename.
GET /messages/{outbox_id}messages.readEstado da mensagem: status, tentativas, último erro e os horários de envio, entrega, leitura e falha.
GET /templatesqualquer chaveModelos aprovados disponíveis (id, nome, idioma, categoria, body_texto, variáveis).
GET /instancesqualquer chaveInstâncias de WhatsApp da empresa (id, nome, phone_number_id). Serve para montar um seletor por nome.
POST /atendimentos/abrir-com-modelomessages.sendAbre atendimento e envia o modelo de abertura para até 50 leads (usado pelo Kanban comercial do ISP).
GET /tripulantesqualquer chaveO boneco do OMNI GAME por login (logins, até 100 separados por vírgula).
GET /healthqualquer chaveQuem é esta chave: empresa, escopos. Serve de teste de conexão.

Sem integration_row_id, o OMNI usa a primeira instância ativa e conectada. Se não houver nenhuma, responde 400 (no_active_integration).

Idempotência: envie o cabeçalho Idempotency-Key (opcional) para que um reenvio em até 24 horas devolva a resposta original em vez de mandar de novo.

Abrir atendimento com modelo ​

Corpo: modelo (nome do modelo aprovado), atendente (email ou login do usuário do OMNI) e itens (telefone, nome, ref). A resposta traz um resultado por item: aberto, em_andamento (já havia atendimento — nada é enviado), telefone_invalido, modelo_invalido ou erro. Um item com erro não derruba os outros.

Webhooks de saída ​

Registre um endereço para receber o andamento das mensagens:

Método e rotaPara quê
POST /webhooks/subscriptionsCria a assinatura. Corpo: url e eventos (padrão: os quatro abaixo). Devolve o segredo uma única vez.
GET /webhooks/subscriptionsLista as assinaturas da chave, com o último estado de entrega.
DELETE /webhooks/subscriptions/{id}Remove.

Eventos: message.sent, message.delivered, message.read, message.failed.

Corpo recebido (JSON):

json
{"evento": "message.delivered", "outbox_id": 101, "destino": "5545999990000",
 "external_message_id": "wamid.EXEMPLO", "error": null, "ts": "2026-10-20T14:00:00"}

Cabeçalhos: X-Integrador-Omni-Signature: sha256=<hex> (HMAC-SHA256 do corpo com o segredo), X-Integrador-Omni-Event e User-Agent: IntegradorOmni-Webhook/1.0. Veja como conferir em Webhooks com HMAC. Responda 2xx para confirmar; qualquer outra resposta gera nova tentativa.

Administração das chaves (sessão de administrador) ​

Estas rotas servem ao painel e usam a sessão do administrador (não a chave de API):

Método e rotaPara quê
GET /api/external-admin/service-accountsLista as contas de serviço.
POST /api/external-admin/service-accountsCria uma conta de serviço (nome).
GET /api/external-admin/api-keysLista as chaves (sem o valor).
POST /api/external-admin/api-keysCria a chave: service_account_id, nome, scopes.
GET /api/external-admin/escoposEscopos conhecidos, com o rótulo em português.
PATCH /api/external-admin/api-keys/{id}Troca os escopos sem trocar o token.
DELETE /api/external-admin/api-keys/{id}Revoga a chave.
GET /api/external-admin/audit-logHistórico das chamadas feitas com as chaves.

Integrações com ERPs ​

O OMNI lê o ERP do provedor durante o atendimento (e nas campanhas). Cada ERP é configurado na Loja de Plugins, com a credencial cifrada.

ERPComo o OMNI autenticaO que faz
Integrador ISPX-API-Key na API /api/webservice/v1/ do ISP (veja Integrador ISP).Leitura completa, desbloqueio de confiança, abertura de atendimento e O.S.
IXCToken de API do IXC (autenticação Basic).Cliente, contratos, boletos, notas, O.S.
SGPAplicativo e token no corpo da requisição (família de rotas de URA do SGP).Somente leitura: cadastro, contratos, conexão e faturas.
HubSoftOAuth2 com usuário e senha da API.Somente leitura: cadastro, faturas, contratos e conexão.

Quando a empresa tem mais de um ERP, o OMNI usa o vínculo do contato (ou o ERP preferencial da empresa) para decidir quem responde. Rotas do painel que cuidam disso: GET /api/integracoes/isp/status, GET /api/integracoes/isp/testar (testa a chave e mostra as permissões) e GET /api/contacts/{id}/erp-vinculos.

As consultas do painel ao ERP passam por um serviço único, GET/POST /api/erp/v1/… (contexto do cliente, status do contrato, boletos, notas, logins, região em manutenção, identificar cliente, enviar boleto, desbloqueio de confiança, diagnóstico). Essas rotas usam a sessão do usuário do OMNI e a permissão dele — não são uma API para sistemas externos.

Integrações com ACS, ASSINA e Canal ISP (configuração) ​

Estas rotas do painel gravam a ligação com os outros produtos. Exigem sessão de administrador.

RotaPara quê
GET/PUT /api/integracoes/acsEndereço do ACS e a chave dedicada (omni_…) gerada na Loja de Plugins do ACS. Só a origem do endereço (https://acs.exemplo.com.br) é guardada.
GET /api/integracoes/acs/statusA integração está pronta?
POST /api/integracoes/acs/testarTesta a conexão.
GET/POST /api/integracoes/assina/config, POST …/assina/testarEndereço e chave do ASSINA. A chave nunca volta em claro.
PUT/GET /api/integracoes/canal-ispConfiguração do Canal ISP (apoio ao técnico em campo).

O SQUAD é ligado pelo par de chaves descrito em Integrador SQUAD.

Canal Integrador ​

O Canal Integrador permite que os sistemas da casa (ISP, ACS, PONTO, ASSINA, DNS e outros) abram um chamado de suporte que cai numa fila do OMNI de quem atende. Não guarda senha de ninguém.

Autenticação: Authorization: Bearer nxa_… (chave pessoal do administrador da empresa que atende). Só funciona se a empresa estiver autorizada a atender pelo canal e o canal estiver ligado.

Método e rotaPara quê
GET /api/canal-integrador/pingTeste de conexão: confirma chave, autorização e o endereço público do canal. Não grava nada.
POST /api/canal-integrador/chamadoAbre (ou atualiza) o chamado. Devolve url com um passe de uso único e expira_em.
POST /api/canal-integrador/entrar/passeA pessoa entra com o passe.
POST /api/canal-integrador/entrar/pedir-codigo e …/entrar/conferirEntrada por código enviado ao e-mail (quando o sistema de origem está fora do ar).
GET /api/canal-integrador/eu, GET …/conversa, POST …/conversa/mensagens, GET …/meus-atendimentosO que a pessoa vê depois de entrar.

Campos do chamado: email e sistema (obrigatórios), nome, empresa_cliente, nivel (o nível de quem pede, que limita o que o atendente pode informar), sistema_id_pessoa, versao, tela_origem, endereco, ip_publico, assunto.

Exemplos ​

Enviar um texto e acompanhar ​

bash
curl -s -X POST https://omni.exemplo.com.br/api/webservice/messages/text \
  -H "X-API-Key: io_live_exemplo_0000000000" \
  -H "Idempotency-Key: aviso-2026-0001" \
  -H "Content-Type: application/json" \
  -d '{"destino": "5545999990000", "texto": "Olá! Sua fatura vence amanhã."}'
json
{"ok": true, "outbox_id": 101, "status": "pending", "idempotent_replay": false}
bash
curl -s https://omni.exemplo.com.br/api/webservice/messages/101 \
  -H "X-API-Key: io_live_exemplo_0000000000"

Registrar um webhook ​

bash
curl -s -X POST https://omni.exemplo.com.br/api/webservice/webhooks/subscriptions \
  -H "X-API-Key: io_live_exemplo_0000000000" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://sistema.exemplo.com.br/hooks/omni"}'

Abrir um chamado no Canal Integrador ​

bash
curl -s -X POST https://omni.exemplo.com.br/api/canal-integrador/chamado \
  -H "Authorization: Bearer nxa_exemplo0000" \
  -H "Content-Type: application/json" \
  -d '{"email": "pessoa@exemplo.com.br", "nome": "Pessoa Exemplo",
       "empresa_cliente": "Provedor Exemplo", "sistema": "Integrador ISP",
       "nivel": "Atendente", "assunto": "Dúvida na tela de faturas"}'

Erros comuns ​

CódigoQuando
400destino ausente, ou nenhuma instância ativa (no_active_integration).
401Chave ausente, em formato inválido, desconhecida ou revogada.
403A chave é de usuário web, não de conta de serviço; ou não tem o escopo (insufficient_scope).
409A mesma Idempotency-Key ainda está sendo processada.
422Erro de validação do envio (por exemplo, modelo inexistente).
429Limite de chamadas por minuto excedido.

Leia também ​

Integrador · software para provedores de internet · integradorisp.com.br