Seu sistema fica sabendo na hora.
A cada reserva, pagamento ou contrato assinado, a Excursso envia um aviso para o endereço que você escolher. Ideal para n8n, Make, Zapier ou o seu próprio servidor.
Como funciona
Você escolhe os eventos
Cadastre um endereço em Configurações › Webhooks e marque só os eventos que interessam.
Assinado
Cada aviso traz uma assinatura feita com o segredo do webhook. Confira antes de confiar no conteúdo.
Tenta de novo
Se o seu endereço não responder, o aviso é reenviado algumas vezes, com intervalos cada vez maiores.
Histórico e teste
O painel mostra as últimas entregas e tem um botão para enviar um aviso de teste.
Sem dados pessoais
O aviso traz identificadores, situação e valores. Nada de CPF, documento, e-mail ou telefone.
Liga com a API
Use o identificador do aviso para buscar os detalhes pela API, com a sua chave.
Como conectar
Cadastre o endereço
Em Configurações › Webhooks, toque em Novo webhook, informe um endereço https:// e escolha os eventos. Copie o segredo na hora.
Receba o aviso
Cada evento chega como um POST com JSON. Responda com um status 2xx em até 10 segundos.
Exemplo de aviso POST https://seu-sistema.com/excursso X-Excursso-Event: payment.received X-Excursso-Signature: t=<unix>,v1=<assinatura> { "id": "<id-do-evento>", "type": "payment.received", "createdAt": "2030-01-10T12:00:00.000Z", "organizationId": "<id-da-agência>", "data": { "bookingId": "<id>", "amountCents": 15000 } }Confira a assinatura
Calcule um HMAC-SHA256 de t + "." + corpo com o segredo e compare com v1. Recuse avisos antigos pelo t.
Node.js import { createHmac, timingSafeEqual } from "node:crypto" const [t, v1] = signature.split(",").map((part) => part.split("=")[1]) const expected = createHmac("sha256", secret).update(`${t}.${body}`).digest("hex") const valid = timingSafeEqual(Buffer.from(expected), Buffer.from(v1))Evite duplicidade
Um aviso pode chegar mais de uma vez. Guarde o id do evento e ignore repetidos.
Eventos
Reservas
booking.created- Reserva criada no painel, pela API ou no site.
booking.confirmed- Primeiro pagamento de uma reserva pendente: a vaga está garantida, não necessariamente quitada.
booking.cancelled- Reserva cancelada.
booking.expired- O prazo da reserva acabou sem pagamento.
Pagamentos
payment.received- Pagamento registrado.
payment.refunded- Devolução registrada.
Contratos
contract.signed- Contrato assinado pelo link da reserva, quando a assinatura de contratos está ligada.
Limites de hoje
- Só endereços https://. Redirecionamentos não são seguidos.
- Um webhook que falha várias vezes seguidas aparece como com falhas no painel, mas continua recebendo.
- O histórico de entregas fica disponível por 30 dias.
Perguntas frequentes
Preciso de uma chave de API para receber webhooks?
Não. A chave só é necessária se você quiser buscar mais detalhes pela API.
O que acontece se eu trocar o segredo?
O segredo antigo para de valer na hora. Atualize o seu sistema logo depois.
Posso ter mais de um endereço?
Pode. Cada webhook tem os próprios eventos e o próprio segredo.

Quer ver as ações em funcionamento?
A demonstração do painel tem o assistente com as operações de consulta, usando dados de exemplo.