excursso.
Webhooks

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

  1. 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.

  2. 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 }
    }
  3. 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))
  4. 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.

Vista aérea de um morro verde à beira-mar no litoral do Rio de Janeiro

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.