Global Construção - Configurações - Webhooks

Importante

Funcionalidade disponível a partir as versões 5.00.00.30 e 5.02.01.99.

Criação de webhooks para obter atualizações em tempo real

Esta integração visa tornar o Carteira de Recebíveis plugável com qualquer sistema externo através de webhooks. Os sistemas externos interessados em receber atualizações de dados do Carteira poderão receber eventos através do cadastro de webhooks nos eventos pré-determinados.

Grid Gestão de Webhooks

Esta grid é controlada pelos botões de + Inserir, Editar e Excluir da tela.

Logs de Integração por evento

Esta grid exibe os logs das requisições.

Filtros da grid

As informações desta grid podem ser filtradas por:

O que você pode fazer:

Criar Webhooks

Criar webhook é um processo simples, basta acessar Global Construção > Configurações > Webhooks e em seguida, clicar no botão + Inserir.

  1. Defina o Nome do webhook e a Url ou endpoint para onde serão realizadas as requisições.
  2. HMAC Secret:
    • O campo Secret contém uma sequência de 16 caracteres, composta por letras, números e símbolos.

    • Ao lado do campo Secret, há um botão que permite gerar automaticamente o conteúdo dessa sequência.

    • O sistema externo utiliza o conteúdo do campo Secret para descriptografar informações e validar requisições.

    • O método de segurança utilizado é o HMAC (Hash-based Message Authentication Code).

      • Para a decodificação, é possível tomar como base a seguinte implementação (index.js, package-lock.json e package.json) neste arquivo compactado.
      Exemplo em Python
      import hmac
      import hashlib
      
      def validar_webhook(payload_bytes: bytes, endpoint_url: str, secret: str, hmac_recebido: str) -> bool:
          dados = payload_bytes.decode("utf-8") + endpoint_url
          calculado = hmac.new(
              secret.encode("utf-8"),
              dados.encode("utf-8"),
              hashlib.sha256
          ).hexdigest()
          return hmac.compare_digest(calculado, hmac_recebido)
      Exemplo em Node.js
      const crypto = require('crypto');
      
          function validarWebhook(payloadString, endpointUrl, secret, hmacRecebido) {
              const dados = payloadString + endpointUrl;
              const calculado = crypto
                  .createHmac('sha256', secret)
                  .update(dados, 'utf8')
                  .digest('hex');
          return crypto.timingSafeEqual(
              Buffer.from(calculado),
              Buffer.from(hmacRecebido)
          );
          }

Importante

Utilize sempre uma comparação em tempo constante (hmac.compare_digest ou timingSafeEqual) para aumentar a segurança durante a validação da assinatura.

  1. No campo Sistema está na Cloud?, marque a opção se for usuário Cloud. Se for On Premise, desmarque esta opção.

  2. Quando a opção Sistema está na Cloud for desmarcada, o campo Tenant será exibido. Preencha o campo Tenant se precisar enviar um identificador específico. Caso o campo seja deixado vazio, o CNPJ do cliente será enviado automaticamente no Webhook.

Importante

  • Clientes On Premise podem utilizar o recurso Webhook para enviar dados, garantindo maior aderência do sistema para integrações externas.
  • Disponível a partir da versão 5.02.01.48.

Após adicionar um novo webhook, será exibido no grid superior da tela principal, a lista de webhooks cadastrados e no grid inferior os logs de todas as requisições enviadas para determinado webhook.


Eventos

Os eventos são nossa maneira de informar quando algo interessante acontece no Carteira. Quando ocorre um evento, o sistema verifica se existe um webhook cadastrado para recebê-lo e na sequência é enviada uma requisição Post para seu endpoint.

Cada evento retorna um objeto diferente.

Pré-requisitos para receber eventos

Para começar a receber notificações, você precisa fornecer ao time da Mega:

ItemDescrição
URL do endpointEndereço HTTPS que receberá os eventos (ex.: https://api.suaempresa.com/webhooks/mega)
SecretString secreta compartilhada usada para validar a autenticidade das requisições

Após cadastro e ativação do webhook, os eventos chegam automaticamente.

Observação

Suporte HTTPS: obrigatório uso de HTTPS.

Headers da requisição

Cada evento é enviado como uma requisição HTTP POST com os seguintes headers:

HeaderExemplo de valorDescrição
Content-Typeapplication/json; charset=utf-8Formato do corpo da requisição.
x_tenant12345678000195_PRODEste campo quando Cloud é informado o tenant automaticamente. Quando On Premise, o identificador do tenant é composto pelo valor preenchido no campo tenant (ou CNPJ se deixado vazio) seguido do ambiente (_PROD ou _HML).
cliente12345678000195CNPJ do cliente cadastrado no ERP, contendo 14 dígitos sem formatação.
hmac_secreta3f5c...Assinatura HMAC-SHA256 utilizada para validar a autenticidade da requisição. Consulte a seção 6.
Recomendação: processe os eventos de forma assíncrona

Se o processamento do evento for demorado, responda 202 Accepted imediatamente e processe em segundo plano. Isso evita timeout e garante que o ERP considere o evento entregue.

Testando a integração

Valide seu endpoint antes de ser cadastrado

Ferramentas como webhook.site ou RequestBin permitem criar um endpoint temporário para inspecionar as requisições antes de implementar seu handler.

Checklist de validação
  • Meu endpoint está acessível via HTTPS
  • Respondo HTTP 2xx em menos de 10 segundos
  • Valido a assinatura HMAC-SHA256 antes de processar
  • Meu parser ignora campos extras desconhecidos no JSON
Resumo das garantias
GarantiaDetalhe
Autenticidade e IntegridadeHMAC-SHA256 sobre payload + endpoint em cada requisição
Identificação de ambienteHeader x_tenant distingue produção de homologação e cliente

Confira os eventos:

Eventos

Importante

  • O evento contrato_criado:
    • Possui um payload específico.
    • É disparado somente por cadastros via ERP, não contemplando APIs, importações ou alterações diretas em banco.

O evento contrato_criado será descontinuado a partir de junho/2027.

contrato_criado
  • Ocorre quando um contrato é inserido com sucesso.

Atenção

Para que unidades sejam integradas, os empreendimentos e os blocos devem estar com o parâmetro Empreendimento na web e Bloco na web marcados. Bem como os contratos que devem ser enviados precisam estar com o parâmetro Contrato na web marcado.

Especificação da requisição

Objeto
  • Método: Post
  • Body: raw/json
Exemplo
[{"cto_in_codigo":"190", //código do contrato recém gerado
"cnd_in_codigo":"12001", //código da proposta do mega
"cnd_in_propostaexterna":"3392" //código da proposta do sistema externo de pré-venda
},
{
"cto_in_codigo":"191", //código do contrato recém gerado
"cnd_in_codigo":"12002", //código da proposta do mega
"cnd_in_propostaexterna":"3393" //código da proposta do sistema externo de pré-venda
}]
"x_tenant": "888a0263-6526-4152-851d-e916k3504b70" //identificador do cliente na mega, quando cloud
"cliente": "60630221000175" //identificador do cliente (cnpj sem caracteres especiais)
"hmac_secret": " /* Método + Body + Url criptografados com este método*/"

Importante

  • Os eventos carteirarecebiveis.contrato.criado, carteirarecebiveis.contrato.atualizado e carteirarecebiveis.contrato.excluido estão disponíveis a partir da versão 5.02.01.65.
  • Eles são disparados a partir de qualquer modificação que ocorrer no sistema, seja através de APIs, importações ou alterações diretas em banco.
carteirarecebiveis.contrato.criado
  • Ocorre quando um novo contrato é registrado no ERP.
Exemplo de Payload
{
   "id": "550e8400-e29b-41d4-a716-446655440001",
   "type": "carteirarecebiveis.contrato.criado",
   "created_at": "2026-08-01T08:50:53.751-03:00",
   "api_version": "v1",
   "data": [
     {
        "cto_in_codigo": "12345",
        "cnd_in_codigo": "678",
        "cnd_in_propostaexterna": "90"
     }
  ]
}
carteirarecebiveis.contrato.atualizado
  • Ocorre quando há alteração nos dados do contrato ou de suas parcelas, taxas, garantias, clientes envolvidos, entre outros.
  • As alterações realizadas no ERP, por integração ou diretamente no banco de dados podem gerar este evento.
  • Os eventos são processados em ciclos de 1 minuto. Alterações realizadas no mesmo contrato durante esse período geram apenas um registro no payload.
  • Quando mais de um contrato é alterado no mesmo ciclo, todos são enviados em uma única requisição.
Exemplo de Payload
{
   "id": "550e8400-e29b-41d4-a716-446655440000",
   "type": "carteirarecebiveis.contrato.atualizado",
   "created_at": "2026-08-01T08:50:53.751-03:00","api_version": "v1",
   "data": [
     { "cto_in_codigo": "12345", "cnd_in_codigo": "678", "cnd_in_propostaexterna": "90" },
     { "cto_in_codigo": "12346", "cnd_in_codigo": "679", "cnd_in_propostaexterna": "" }
  ]
}
carteirarecebiveis.contrato.excluido
  • Ocorre quando um contrato é removido do ERP.

Importante

Quando um contrato é excluído, o ERP inclui no payload os dados disponíveis no momento da exclusão. Dependendo do momento do processamento, alguns campos podem não estar mais disponíveis no sistema de origem.

Exemplo de Payload
{
   "id": "550e8400-e29b-41d4-a716-446655440002",
   "type": "carteirarecebiveis.contrato.excluido",
   "created_at": "2026-08-01T08:50:53.751-03:00",
   "api_version": "v1",
   "data": [
     {
        "cto_in_codigo": "12345",
        "cnd_in_codigo": "678",
        "cnd_in_propostaexterna": "90"
     }
  ]
}

Especificidades dos eventos:

Formato de Payload

Todos os eventos usam o mesmo envelope JSON:

{
"id": "550e8400-e29b-41d4-a716-446655440001",
"type": "carteirarecebiveis.contrato.criado",
"created_at": "2026-08-01T08:50:53.751-03:00",
"api_version": "v1",  
"data": [  
    {  
        "cto_in_codigo": "12345",  
        "cnd_in_codigo": "678",  
        "cnd_in_propostaexterna": "90"  
        }  
        ]  
        }

Campos do envelope

CampoTipoDescrição
idstring (UUID v4)Identificador único e imutável deste evento. Use-o para idempotência. Se o mesmo id chegar duas vezes, trate o evento como duplicado.
typestringTipo do evento. Consulte a tabela da seção 3.
created_atstring (ISO-8601 com timezone)Data e hora em que o evento ocorreu no ERP. Exemplo: 2026-08-01T08:50:53.751-03:00.
api_versionstringVersão do contrato de eventos. Atualmente v1. Será incrementada quando houver mudanças incompatíveis.
dataarray de objetosLista de contratos afetados pelo evento.

Campos de objeto em data

CampoTipoDescrição
cto_in_codigostringCódigo interno do contrato no ERP.
cnd_in_codigostringCódigo da proposta vinculada.
cnd_in_propostaexternastringCódigo da proposta no sistema externo. Este campo pode estar vazio.
Retorno do endpoint

Após processar o evento, seu endpoint deve responder com um código de status HTTP da faixa 2xx (200, 201, 202 ou 204).

RespostaInterpretação pelo ERP Senior Mega
2xx (qualquer código)Evento recebido com sucesso. O evento não será reenviado.
4xx ou 5xxO envio será considerado não concluído e o evento entrará na fila de novas tentativas automáticas.
Timeout (> 10 segundos)O envio será considerado não concluído e seguirá o mesmo fluxo de novas tentativas.

Importante

O conteúdo do body não é interpretado. Apenas o status code importa.

Exemplo de requisição completa
POST https://api.suaempresa.com/webhooks/mega HTTP/1.1
Content-Type: application/json; charset=utf-8
x_tenant: 12345678000195_PROD
x_cliente: 12345678000195
hmac_secret: a3f5c9d2e1b8f047c6a2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4
{
    "id": "550e8400-e29b-41d4-a716-446655440001",
    "type": "carteirarecebiveis.contrato.criado",
    "created_at": "2026-08-01T00:50:53.751-03:00",
    "api_version": "v1",
    "data": [
        {
            "cto_in_codigo": "12345",
            "cnd_in_codigo": "678",
            "cnd_in_propostaexterna": "90"
            }
            ]
            }
Garantias de entregas e retentativas

O ERP Senior Mega utiliza um mecanismo de retentativas com intervalo crescente (exponential backoff) para garantir a entrega dos eventos.

Nenhum evento é descartado imediatamente. Sempre que uma tentativa de entrega não for concluída com sucesso, novas tentativas serão realizadas automaticamente.

Ciclo de vida de um evento

Evento gerado no ERP:

  • Enfileirado para envio (status: PENDENTE)
  • Enviado para o endpoint configurado
    • Se retornar HTTP 2xx: evento entregue com sucesso.
    • Caso contrário: nova tentativa agendada.
    • Processo repetido até atingir os critérios de descarte.
Intervalos de Retentativa

A cada falha no envio, uma nova tentativa é agendada com um intervalo progressivamente maior.

TentativaAguarda antes de reenviarTempo total desde o evento
1ª falha2 minutos≈ 2 min
2ª falha4 minutos≈ 6 min
3ª falha8 minutos≈ 14 min
4ª falha16 minutos≈ 30 min
5ª falha32 minutos≈ 1h 02min
6ª falha1h 04min≈ 2h 06min
7ª falha2h 08min≈ 4h 14min
8ª falha4h 16min≈ 8h 30min
9ª falha8h 32min≈ 17h 02min
10ª tentativa em dianteLimitado pelo período máximo de 24 horas≈ 24h → descarte
Regras de descarte

Um evento é descartado apenas quando as duas condições abaixo são atendidas simultaneamente:

  • O evento permanece sem entrega bem-sucedida por mais de 24 horas.
  • Já foram realizadas pelo menos 5 tentativas de envio.

Isso garante que, mesmo que o serviço responsável pelo recebimento dos eventos fique indisponível temporariamente, novas tentativas continuarão sendo realizadas antes que o evento seja descartado.

Importante

  • Se o endpoint retornar respostas sem sucesso por mais de 24 horas e houver pelo menos 5 tentativas de envio, o webhook poderá ser desativado automaticamente.
  • Após a normalização do ambiente, entre em contato com a equipe da Mega para reativar a integração.
Idempotência: Como lidar com duplicatas

O campo id de cada evento é um UUID único e imutável. Em cenários de retentativa.

Exemplo

Seu servidor processou o evento mas demorou a responder e ocorreu timeout), o mesmo evento pode ser entregue mais de uma vez com o mesmo id.

Recomendamos que seu sistema armazene os id processados e ignore eventos com id já visto. Isso torna sua integração segura a duplicatas.

Ao receber um evento, siga os passos abaixo:

  1. Verifique se o id já foi processado;
  2. Se sim: responda 200 e ignore;
  3. Se não: processe e marque o id como processado.
Versionamento da API

O campo api_version informa a versão do contrato de eventos. Atualmente "v1".

VersãoComportamento esperado
v1Formato atual, descrito neste documento
Versões futurasSerão comunicadas com antecedência

Mudanças que quebram compatibilidade serão sempre acompanhadas de incremento de versão e comunicação prévia. Mudanças aditivas (novos campos opcionais) podem ocorrer sem incremento de versão. Recomendamos que seu parser ignore campos desconhecidos.

Resumo das garantias
GarantiaDetalhe
At-least-once deliveryCada evento é tentado até entrega confirmada (HTTP 2xx) ou descarte após 24h + 5 tentativas
UUID único por eventoO campo id identifica unicamente cada evento para idempotência
Timeout de 10 segundosSeu endpoint tem 10s para responder antes de ser tratado como falha
Retentativas automáticasBackoff exponencial, intervalos de 2min a ~8h entre tentativas
VersionamentoCampo api_version para controle de compatibilidade
Testando a integração

Valide seu endpoint antes de ser cadastrado

Ferramentas como webhook.site ou RequestBin permitem criar um endpoint temporário para inspecionar as requisições antes de implementar seu handler.

Checklist de validação
  • Meu endpoint está acessível via HTTPS
  • Respondo HTTP 2xx em menos de 10 segundos
  • Valido a assinatura HMAC-SHA256 antes de processar
  • Implemento idempotência pelo campo id
  • Meu parser ignora campos extras desconhecidos no JSON
  • Processo os três tipos de evento (criado, atualizado, excluido)
  • Trato o campo data como array (pode conter múltiplos contratos)

Informações Adicionais

SituaçãoDetalhes
Evento de atualizaçãoOs eventos de atualização são enviados em ciclos de processamento realizados a cada 1 minuto. Se um mesmo contrato for alterado várias vezes nesse período, será enviado apenas um evento de atualização. Para consultar os detalhes das alterações, utilize o ERP.
Endpoint indisponívelQuando o endpoint estiver temporariamente indisponível, o sistema realizará novas tentativas automáticas utilizando backoff. Assim que o endpoint voltar a responder com HTTP 2xx, os eventos pendentes serão entregues em sequência. Eventos com menos de 24 horas e que ainda possuam tentativas disponíveis permanecem na fila para novo processamento.
Eventos fora de ordemOs eventos são enviados respeitando a ordem de criação dentro do mesmo ciclo de processamento. Entretanto, as retentativas podem fazer com que um evento mais antigo seja recebido após um evento mais recente. Para identificar a ordem cronológica correta, utilize o campo created_at.
Ambiente de envio(Apenas para On Premise) O ambiente que enviou o evento pode ser identificado pelo cabeçalho da requisição. O valor tenant com o sufixo _PROD indica produção, enquanto o sufixo _HMLG indica homologação.
Processamento após retorno 200O código 200 confirma apenas o recebimento da mensagem pelo endpoint. Após essa confirmação, o evento é considerado entregue e não é reenviado. O processamento do conteúdo é responsabilidade da aplicação receptora.
Conteúdo do campo dataO campo data sempre possui conteúdo. Os eventos são publicados somente quando existe pelo menos um contrato impactado pela operação realizada.
Eventos por instalação do MegaConstruçãoCada endpoint recebe apenas os eventos vinculados ao ambiente cadastrado. Para identificar a origem do evento, utilize as informações do cliente ou do CNPJ presentes na mensagem recebida.

Este artigo ajudou você?