Introdução
Nuntis
O Nuntis é o serviço de mensageria multicanal da Devari. Ele envia e recebe mensagens por múltiplos canais e múltiplos números, sob um contrato de API estável, para que o seu produto não precise resolver isso por conta própria.
O nome vem do latim nuntius, o mensageiro — aquele que falava em nome de outro, nunca por si. As duas propriedades do cargo são as duas propriedades do serviço, e vale desenhar a sua integração em torno delas:
- Ele fala em nome do seu produto, nunca por si. A mensagem é sua. O Nuntis não decide o que dizer, não guarda a sua regra de negócio e não é dono do conteúdo — ele empresta a voz.
- Ele entrega apesar do entorno. A entrega não pode depender de um canal estar bom ou de um número estar disponível. É daí que vêm multi-canal e multi-número: não são recursos extras, são a razão de existir.
O que dá para fazer
Enviar
POST /v1/messages — texto e mídia, pelo número que você escolher.
Receber
Um webhook assinado que o Nuntis chama no seu servidor a cada evento.
Saber o estado
Eventos de status no mesmo webhook: enviada, entregue, lida, falhou.
O resto — consultar histórico, parear um número, checar o que cada canal suporta — é apoio para essas três coisas.
Os canais
O canal não é um parâmetro que você passa. Ele é uma
propriedade do número que envia: você informa o numberId, e o
canal daquele número decide o caminho. O mesmo
POST /v1/messages serve a todos.
| Canal | id no contrato | Recibos de entrega |
|---|---|---|
whatsapp-unofficial |
até read |
|
| Telegram | telegram |
none — sent é o estado final de sucesso |
A lista acima é um retrato. A fonte da verdade é
GET /v1/channels, que declara, canal a canal, o que ele sabe
fazer: tipos de mídia aceitos, se há janela de resposta, se exige template,
e até onde vão os recibos.
Se a sua interface mostrar “lida” e o canal só reportar “entregue”, a tela mente para o seu usuário. Canais têm capacidades diferentes e um contrato só — o que separa os dois é você ler a declaração.
O modelo
Cinco conceitos, encaixados. Entender o encaixe evita quase todo erro de integração:
seu produto ← uma API key, o limite de tudo que você enxerga
└── clientes ← os clientes finais do SEU produto
└── operadores ← quem atende (uma pessoa, um time, um bot)
└── números ← as linhas por onde se fala (cada uma tem um canal)
└── conversas → mensagens
| Conceito | O que é | Identificador |
|---|---|---|
| Produto | Você. É o escopo da sua API key: tudo que ela alcança, e nada além. | — |
| Cliente | Um cliente final do seu produto. Serve para separar o que é de quem. | cus_… |
| Operador | Quem conversa: uma pessoa, um time ou um atendimento automatizado. | op_… |
| Número | A linha por onde se fala. O canal é propriedade dela. | num_… |
| Conversa | O fio contínuo entre um número seu e um contato. | conv_… |
| Mensagem | Cada mensagem, em qualquer direção. | msg_… |
Uma API key por produto
A key é o seu limite. Todo recurso que você lê ou escreve
pertence ao seu produto, e recurso de outro produto responde
404 — nunca 403. Isso é deliberado: um
403 confirmaria que o recurso existe, e IDs adivinháveis
transformariam a resposta num enumerador da base alheia.
Corolário prático: não crie uma key por cliente final. A separação entre os seus clientes é feita pelo modelo acima, não por credenciais. Uma key por produto, por ambiente.
Correlacionar com os seus próprios IDs
Todo identificador do Nuntis é opaco: msg_18273,
num_4711, conv_991. Não os parseie, não ordene por
eles, não infira nada do conteúdo — o formato interno pode mudar sem aviso.
Guarde-os como texto.
Para ligar um recurso do Nuntis ao seu próprio registro, cada cliente,
operador e número aceita um externalRef: uma
string sua, única dentro do seu produto para aquele tipo de recurso. É por ela
que você mapeia “o operador op_88 é o usuário 4711
no meu banco” sem manter uma tabela de tradução frágil.
As rotas de criação self-service de clientes, operadores e números ainda não fazem parte do contrato público — hoje esses recursos são provisionados pela Devari a seu pedido, e você recebe os identificadores prontos. A seção entra nesta documentação quando as rotas existirem. Tudo o mais nestas páginas já está no ar.
Como começar
- Receba a sua API key e os identificadores dos seus números.
- Registre o seu webhook e guarde o segredo em cofre.
- Implemente o receptor com corpo cru e verificação de assinatura.
- Leia
GET /v1/channelsuma vez, no boot, e guarde a capacidade. - Envie com
Idempotency-Keye guarde oidretornado. - Atualize o seu estado a partir dos eventos que chegarem no webhook.
Estabilidade do contrato
O contrato é versionado no caminho (/v1). Duas regras valem
sempre:
- Acréscimo é livre. Campo novo, rota nova, código de erro novo e valor novo de enum podem aparecer a qualquer momento. Escreva o seu cliente para ignorar o que não conhece, nunca para quebrar.
-
Mudança quebrante exige
/v2e plano de migração. Remover ou renomear campo, mudar o significado de um valor ou apertar uma validação não acontece debaixo de você.