Mensageria Externa Fagron Tech · Documentação API
DEV
Documentação para parceiros · Ambiente DEV

API de Mensageria Externa

Envie e receba mensagens fora do ERP Fórmula Certa e Phusion. Autentique-se uma vez, dispare mensagens por um endpoint e receba os eventos de retorno automaticamente no seu webhook.

Introdução

Visão geral

Esta documentação apresenta a API de Mensageria Externa no formato de referência (estilo Swagger) e descreve como um parceiro deve autenticar e integrar o próprio sistema.

A API foi criada para permitir que o cliente envie e receba mensagens fora do ERP Fórmula Certa ou Phusion, mantendo a integração de mensageria ativa por meio de uma aplicação externa.

Enviar mensagens

Dispare texto, imagem, áudio ou template para seus contatos via endpoint de envio.

Receber mensagens

Receba eventos de mensagem (tipo 1) no webhook que você configurar.

Acompanhar status

Receba eventos de status de entrega (tipo 2) para conciliar cada envio.

A configuração de webhook é obrigatória para receber os eventos de mensagem e de status no seu sistema.

Introdução

O que é webhook

Webhook é uma URL HTTP do seu sistema que recebe eventos automaticamente quando algo acontece na API.

Em vez de consultar a API repetidamente para verificar atualizações, é a API que envia um POST para o endpoint que você configurou assim que houver um novo evento.

Nesta integração, o webhook é utilizado para receber:

  • eventos de mensagem (tipo = 1);
  • eventos de status de mensagem (tipo = 2).

Introdução

Ambientes e URLs

DEV

RecursoURL
APIhttps://fate-mensageria-externa-api-dev-02.fagron.tech
Swagger/swagger/index.html
SSO (token)https://sso-dev-02.fagron.tech/connect/token

Produção

As credenciais e URLs de produção são diferentes do ambiente DEV e serão compartilhadas em um segundo momento pela nossa equipe.

Introdução

Contrato padrão de resposta

Todos os endpoints retornam o mesmo envelope:

JSON
{
  "sucesso": true,
  "resultado": {},
  "erros": null
}
CampoDescrição
sucessoIndica sucesso ou falha da operação.
resultadoPayload de retorno em caso de sucesso.
errosLista de erros em caso de falha.

Comece por aqui

Guia de início rápido

Do zero ao primeiro envio em 8 passos. Os exemplos usam o ambiente DEV — troque os valores entre {{ }} pelos seus.

Passo 1 · Solicite usuário e senha

Solicite à nossa equipe um usuário e uma senha para o ambiente.

Passo 2 · Gere o token no SSO

Copie o comando abaixo, trocando Seu_Usuario e Sua_Senha. No retorno, copie o valor de access_token.

cURL
curl --location 'https://sso-dev-02.fagron.tech/connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=Seu_Usuario' \
--data-urlencode 'password=Sua_Senha' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=fate_mensageria_externa_api' \
--data-urlencode 'client_secret={{CLIENT_SECRET}}' \
--data-urlencode 'scope=fate_mensageria_externa'

Passo 3 · Liste os webhooks cadastrados

Troque {{ACCESS_TOKEN}} pelo token do passo anterior.

cURL
curl --location 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}'

Se vier uma lista vazia, siga para o Passo 4 (cadastrar webhook). Se o webhook já existir e estiver correto, pule para o Passo 7 (enviar mensagem).

Passo 4 · Cadastre o webhook (se não existir)

cURL
curl --location 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--data '{
  "enderecoUrl": "https://seu-dominio.com/webhook/status",
  "tipo": 2,
  "headerName": "X-Webhook-Token",
  "headerValue": "seu-token-secreto",
  "envioParaWebhookEFila": false
}'

Use tipo: 1 para evento de mensagem e tipo: 2 para evento de status. Cadastre os dois se quiser receber ambos.

Passo 5 · Altere o webhook (se precisar)

Use o id retornado na listagem ou no cadastro.

cURL
curl --location --request PUT 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao/{{ID_CONFIGURACAO}}' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--data '{
  "enderecoUrl": "https://seu-dominio.com/webhook/status-v2",
  "tipo": 2,
  "headerName": "X-Webhook-Token",
  "headerValue": "novo-token-secreto",
  "envioParaWebhookEFila": true
}'

Passo 6 · Exclua o webhook (se precisar remover)

cURL
curl --location --request DELETE 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao/{{ID_CONFIGURACAO}}' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}'

Passo 7 · Envie uma mensagem

cURL
curl --location 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/Mensagem/enviar' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--data '{
  "para": "5511999999999",
  "de": "5511888888888",
  "texto": "Mensagem de teste",
  "provedor": "nome-do-provedor",
  "tipoMensagem": 1,
  "produto": "MeuProduto"
}'

Passo 8 · Aguarde o retorno no seu webhook

Após o envio, aguarde as chamadas HTTP no endpoint configurado por você. Os retornos chegam como eventos de:

  • Mensagem (tipo = 1) — dados da mensagem recebida/processada: telefone de origem, destino, texto, anexos, produto, tenant e identificadores de acompanhamento;
  • Status (tipo = 2) — andamento do envio: status, descrição, data, código/descrição de erro (quando houver) e acompanhamentoId para conciliação.

Comece por aqui

Autenticação (SSO)

A API usa autenticação Bearer Token. Gere o token no SSO com seu usuário e senha (fluxo password) e envie-o no header Authorization de cada requisição.

POST https://sso-dev-02.fagron.tech/connect/token

Parâmetros (x-www-form-urlencoded)

ParâmetroValor
grant_typepassword
usernameseu usuário
passwordsua senha
client_idfate_mensageria_externa_api
client_secret{{CLIENT_SECRET}} — fornecido pela nossa equipe
scopefate_mensageria_externa

Exemplo

cURL
curl --location 'https://sso-dev-02.fagron.tech/connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=Seu_Usuario' \
--data-urlencode 'password=Sua_Senha' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=fate_mensageria_externa_api' \
--data-urlencode 'client_secret={{CLIENT_SECRET}}' \
--data-urlencode 'scope=fate_mensageria_externa'

Usando o token

Inclua o access_token retornado no header de toda chamada à API:

HTTP Header
Authorization: Bearer {{ACCESS_TOKEN}}

Solicite o client_secret, o usuário e a senha à nossa equipe (DEV e produção usam segredos diferentes). Nunca exponha credenciais em repositórios públicos, no front-end ou em páginas acessíveis externamente.

Experimente

Playground

Gere um token de homologação e faça chamadas reais à API direto desta página. Edite o corpo, envie e veja a resposta — ou copie tudo como cURL.

Suas credenciais ficam apenas no seu navegador e são enviadas diretamente para a API de homologação — nada passa por nós nem é gravado. O token vale só para esta sessão (não é salvo). Use apenas dados de homologação/DEV.

As chamadas saem do seu navegador. Se a API não autorizar a origem desta página (CORS) — por exemplo ao abrir o arquivo localmente — o navegador bloqueia a requisição. Nesse caso use Copiar como cURL e rode no terminal/Postman, ou hospede a página numa origem autorizada.

1 Autenticação
Sem token

2 Requisição
POST

API · Mensagem

Enviar mensagem

Enfileira uma mensagem para processamento e envio.

POST /api/Mensagem/enviar

Regras importantes

  • para é obrigatório;
  • de é obrigatório;
  • provedor é obrigatório;
  • para envio de anexo, informe mediaUrl com uma URL pública HTTPS do arquivo;
  • para envio por template, o template já deve estar previamente configurado no Mobypharma.

Campos do corpo

CampoTipoObrig.Descrição
parastringSimNúmero de destino (com DDI/DDD).
destringSimNúmero de origem.
provedorstringSimProvedor de envio. Ex.: twilio.
tipoMensagemintTipo da mensagem. Ver enum tipoMensagem.
textostringcond.Conteúdo de texto ou corpo do template.
mediaUrlstringcond.URL pública HTTPS do anexo (imagem/áudio).
produtostringProduto de origem. Ex.: phusion.
templateobjetocond.Dados do template: nome, linguagem, contentTemplateSId.
dadosTemplateobjetocond.Parâmetros do template: tipo e parametros[].

Exemplos de corpo por tipo

JSON · tipoMensagem 1
{
  "para": "5511997370379",
  "de": "5540200236",
  "texto": "Teste envio Postman",
  "provedor": "twilio",
  "tipoMensagem": 1,
  "produto": "phusion"
}

Exemplo cURL

cURL
curl --location 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/Mensagem/enviar' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--data '{
  "para": "5511999999999",
  "de": "5511888888888",
  "texto": "Mensagem de teste",
  "provedor": "nome-do-provedor",
  "tipoMensagem": 1,
  "produto": "MeuProduto"
}'

Respostas

200OK — mensagem enfileirada
JSON
{
  "sucesso": true,
  "resultado": {
    "id": "6626cb9b2b7d5f6c5f87a912",
    "registradoEm": "2026-04-22T14:30:12.345Z"
  },
  "erros": null
}
400Bad Request — validação
JSON
{
  "sucesso": false,
  "resultado": null,
  "erros": [
    "Para e obrigatorio.",
    "De e obrigatorio.",
    "Provedor e obrigatorio."
  ]
}
400Bad Request — configuração tenant/número
JSON
{
  "sucesso": false,
  "resultado": null,
  "erros": [
    "Configuracao nao encontrada para o tenantId e numero informados."
  ]
}
401Unauthorized
JSON
{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.5.2",
  "title": "Unauthorized",
  "status": 401
}
500Internal Server Error
JSON
{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.6.1",
  "title": "An error occurred while processing your request.",
  "status": 500
}

API · Webhook Configuração

Listar configurações

Lista as configurações de webhook do tenant autenticado.

GET /api/WebhookConfiguracao

Exemplo cURL

cURL
curl --location 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}'

Respostas

200OK
JSON
{
  "sucesso": true,
  "resultado": [
    {
      "id": "6626cf0d2b7d5f6c5f87a913",
      "tenant": "tenant-exemplo",
      "enderecoUrl": "https://parceiro.com/webhooks/mensagem",
      "tipo": 1,
      "headerName": "X-Webhook-Token",
      "headerValue": "token-seguro",
      "envioParaWebhookEFila": false
    },
    {
      "id": "6626d0102b7d5f6c5f87a914",
      "tenant": "tenant-exemplo",
      "enderecoUrl": "https://parceiro.com/webhooks/status",
      "tipo": 2,
      "headerName": "X-Webhook-Token",
      "headerValue": "token-seguro",
      "envioParaWebhookEFila": false
    }
  ],
  "erros": null
}
400Bad Request
JSON
{
  "sucesso": false,
  "resultado": null,
  "erros": [
    "Erro ao se comunicar com o servico de configuracao de webhook."
  ]
}

API · Webhook Configuração

Criar configuração

Cria uma configuração de webhook.

POST /api/WebhookConfiguracao

Campos do corpo

CampoTipoObrig.Descrição
enderecoUrlstringSimURL do seu endpoint. Deve usar HTTPS.
tipointSim1 = Mensagem, 2 = Status.
headerNamestringNome do header de segurança enviado nas chamadas.
headerValuestringValor do header de segurança.
envioParaWebhookEFilaboolDefine o envio para webhook e fila.

Exemplo cURL

cURL
curl --location 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--data '{
  "enderecoUrl": "https://parceiro.com/webhooks/status",
  "tipo": 2,
  "headerName": "X-Webhook-Token",
  "headerValue": "token-seguro",
  "envioParaWebhookEFila": false
}'

Respostas

200OK — criado
JSON
{
  "sucesso": true,
  "resultado": {
    "id": "6626cf0d2b7d5f6c5f87a913",
    "tenant": "tenant-exemplo",
    "enderecoUrl": "https://parceiro.com/webhooks/status",
    "tipo": 2,
    "headerName": "X-Webhook-Token",
    "headerValue": "token-seguro",
    "envioParaWebhookEFila": false
  },
  "erros": null
}
400Bad Request — validação
JSON
{
  "sucesso": false,
  "resultado": null,
  "erros": [
    "EnderecoUrl e obrigatoria.",
    "EnderecoUrl deve utilizar o protocolo HTTPS.",
    "Tipo deve ser um dos valores validos do enum (1 - Mensagem ou 2 - Status)."
  ]
}

API · Webhook Configuração

Atualizar configuração

Atualiza uma configuração de webhook existente.

PUT /api/WebhookConfiguracao/{id}

Exemplo cURL

cURL
curl --location --request PUT 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao/{{ID_CONFIGURACAO}}' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--data '{
  "enderecoUrl": "https://parceiro.com/webhooks/status-v2",
  "tipo": 2,
  "headerName": "X-Webhook-Token",
  "headerValue": "token-seguro-novo",
  "envioParaWebhookEFila": true
}'

Respostas

200OK — atualizado
JSON
{
  "sucesso": true,
  "resultado": {
    "id": "6626cf0d2b7d5f6c5f87a913",
    "tenant": "tenant-exemplo",
    "enderecoUrl": "https://parceiro.com/webhooks/status-v2",
    "tipo": 2,
    "headerName": "X-Webhook-Token",
    "headerValue": "token-seguro-novo",
    "envioParaWebhookEFila": true
  },
  "erros": null
}
400Bad Request
JSON
{
  "sucesso": false,
  "resultado": null,
  "erros": [
    "EnderecoUrl deve utilizar o protocolo HTTPS."
  ]
}

API · Webhook Configuração

Excluir configuração

Exclui uma configuração de webhook.

DELETE /api/WebhookConfiguracao/{id}

Exemplo cURL

cURL
curl --location --request DELETE 'https://fate-mensageria-externa-api-dev-02.fagron.tech/api/WebhookConfiguracao/{{ID_CONFIGURACAO}}' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}'

Respostas

200OK — excluído
JSON
{
  "sucesso": true,
  "resultado": true,
  "erros": null
}
400Bad Request
JSON
{
  "sucesso": false,
  "resultado": null,
  "erros": [
    "Erro ao se comunicar com o servico de configuracao de webhook."
  ]
}

Eventos no seu webhook

Evento de Mensagem (tipo 1)

Quando configurado, o sistema envia POST no seu enderecoUrl com Content-Type: application/json. Se headerName e headerValue estiverem preenchidos, o header também é enviado.

No webhook de mensagem (tipo = 1), devolvemos os dados da mensagem recebida/processada.

CampoDescrição
acompanhamentoIdIdentificador de acompanhamento da mensagem.
canalCanal de origem. Ex.: WhatsApp.
tenant / filialIdentificação do tenant e da filial.
clienteNomeNome do contato.
de / paraTelefone de origem e de destino.
textoConteúdo textual da mensagem.
canalParticularidadeMetadados do canal (JSON serializado). Ex.: provedor.
produtoProduto associado.
time / sequencyMarca de tempo e sequência da mensagem.
anexos[]Anexos com tipo, url e thumbnail.
mensagemCitadaMensagem citada (reply), quando houver.
mensagemEnviadaControle de fluxo: indica se a mensagem foi enviada por você.

Exemplo de payload

JSON · enviado ao seu webhook
{
  "acompanhamentoId": "wamid.HBgLM...",
  "canal": "WhatsApp",
  "tenant": "tenant-exemplo",
  "filial": 123,
  "clienteNome": "Maria",
  "de": "5511999999999",
  "para": "5511888888888",
  "texto": "Oi, preciso de ajuda",
  "canalParticularidade": "{\"Provedor\":\"nome-do-provedor\"}",
  "produto": "MeuProduto",
  "time": 1713796502,
  "sequency": 1,
  "anexos": [
    {
      "tipo": "Imagem",
      "url": "https://cdn.parceiro.com/imagem.jpg",
      "thumbnail": "https://cdn.parceiro.com/thumb.jpg"
    }
  ],
  "mensagemCitada": {
    "mensagemCitadaId": "wamid.HBgLMabc",
    "textoCitado": "Mensagem anterior",
    "urlAnexoCitado": null,
    "tipoAnexo": null
  },
  "mensagemEnviada": false
}

Eventos no seu webhook

Evento de Status (tipo 2)

No webhook de status (tipo = 2), devolvemos o andamento do envio.

CampoDescrição
acompanhamentoIdIdentificador para conciliação — tende a representar o id retornado no POST /api/Mensagem/enviar.
statusCódigo do status atual da mensagem.
descricaoDescrição legível do status. Ex.: Mensagem entregue.
dataRecebimentoData/hora do evento (ISO 8601).
produto / tenantIdentificação do produto e do tenant.
erroCodigo / erroMensagemCódigo e descrição do erro, quando houver.

Exemplo de payload

JSON · enviado ao seu webhook
{
  "acompanhamentoId": "6626cb9b2b7d5f6c5f87a912",
  "status": 2,
  "descricao": "Mensagem entregue",
  "dataRecebimento": "2026-04-22T14:33:21.198Z",
  "produto": "MeuProduto",
  "tenant": "tenant-exemplo",
  "erroCodigo": null,
  "erroMensagem": null
}

Use o acompanhamentoId para casar o evento de status com o id recebido na resposta do envio e conciliar a entrega no seu sistema.

Eventos no seu webhook

Resposta esperada do seu endpoint

Para confirmar o recebimento correto do evento, seu endpoint deve responder com HTTP 2xx.

200OK
204No Content

Respostas fora da faixa 2xx são tratadas como falha de entrega do evento ao seu sistema.

Referência

Enums

tipoMensagem — tipo da mensagem enviada

ValorSignificado
1Texto
2Imagem
5Template
9Áudio

tipo — tipo de webhook

ValorSignificado
1Mensagem
2Status

Regras de webhook

  • enderecoUrl é obrigatório;
  • enderecoUrl deve ser HTTPS;
  • tipo deve ser 1 ou 2.

Referência

Erros e respostas HTTP

Em caso de falha, o envelope traz sucesso: false e a lista erros preenchida. Os principais códigos:

HTTPSignificadoQuando acontece
200OKOperação concluída com sucesso.
400Bad RequestValidação de campos, configuração ausente ou falha ao comunicar com o serviço de webhook.
401UnauthorizedToken ausente, inválido ou expirado. Gere um novo no SSO.
500Internal Server ErrorErro inesperado ao processar a requisição.

Recebeu 401? O token expirou — refaça o passo de autenticação e use o novo access_token.