Skip to main content
Toda entrega de webhook carrega um corpo JSON com a mesma estrutura de envelope, independentemente do tipo de evento. Esta página explica cada campo e os dois mais importantes de acertar na sua integração: sequence e applicationId.

O envelope

O corpo é idêntico byte a byte em todas as entregas e replays do mesmo evento. Tudo o que varia por tentativa de entrega — o ID da entrega, o contador de tentativas, o timestamp, a assinatura — fica nos cabeçalhos HTTP.

Eventos, entregas e tentativas

Três registros distintos estão por trás de cada webhook que chega até você, e cada um carrega seu próprio identificador e seus próprios timestamps. Mantê-los separados é a chave para reconciliar os vários timestamps e a lógica de sequence abaixo. A divisão segue uma regra: tudo o que é intrínseco ao eventoid, type, sequence, originalCreateDate, data — fica no corpo e nunca muda; tudo o que descreve esta requisição HTTP específica — ID da entrega, número da tentativa, tipo da tentativa, timestamp, assinatura — fica nos cabeçalhos e é regenerado a cada tentativa.
Ao ordenar o estado do negócio, confie no evento, nunca na tentativa. Um replay de um evento antigo chega com um Sphere-Timestamp novo (para passar nas verificações de tolerância da assinatura), mas seu sequence e originalCreateDate ainda refletem quando a mudança de estado realmente ocorreu. Ordenar por Sphere-Timestamp faria um evento antigo reenviado parecer mais novo do que os eventos que o sucederam — ordenar por sequence mantém os replays inofensivos.

Payloads carregam a mudança de estado, não o recurso completo

Os payloads de webhook contêm deliberadamente o mínimo de que você precisa para reagir: o ID do recurso e a transição de previousStatus para status. Eles não contêm o objeto completo do recurso. A maioria das reações — rotear pelo novo status, atualizar a linha correspondente no seu próprio banco de dados, notificar sua equipe de operações — funciona apenas com o payload. Quando precisar do recurso completo (critérios de verificação completos, detalhes de conta bancária, valores da transferência), busque-o no endpoint GET do recurso:
Como o payload é mínimo e imutável, um evento reenviado nunca carrega dados obsoletos se passando por atuais — ele descreve uma transição que aconteceu em originalCreateDate. Se você sempre fizer GET no recurso para obter seu estado atual antes de executar efeitos colaterais, os replays são inofensivos.

O campo sequence

sequence é um inteiro monotonicamente crescente com escopo em uma única instância de recurso — um contador por cliente, um por transferência, e assim por diante, indexado por data.id. Ele é atribuído quando o evento é criado e nunca muda, de modo que reflete a ordem verdadeira em que as mudanças de estado ocorreram, mesmo quando as entregas chegam fora de ordem. Como a ordem de entrega não é garantida, use sequence para se proteger contra atualizações obsoletas:
  1. Armazene o maior sequence que você já processou por instância de recurso — por exemplo, uma coluna lastSphereSequence na linha do cliente no seu próprio banco de dados.
  2. Quando um evento chegar, compare seu sequence com o valor armazenado para aquele data.id.
  3. Se incoming.sequence <= stored.sequence, o evento é obsoleto ou duplicado — confirme com um 2xx e pule a atualização.
  4. Caso contrário, aplique a atualização e armazene o novo sequence.
Você não precisa de um contador global na sua conta — apenas de rastreamento por entidade, colocalizado com o estado do recurso que você já mantém.
Não presuma que os valores de sequence que você recebe são contíguos. Se o seu endpoint assina um subconjunto dos eventos de um recurso, você observará lacunas — use a comparação de obsolescência <= acima, nunca detecção de lacunas.

Por que ambos sequence e originalCreateDate?

Eles respondem a perguntas diferentes. originalCreateDate diz quando uma mudança de estado aconteceu — tempo de relógio, útil para exibição, trilhas de auditoria e consultas por janela de tempo. Mas o tempo de relógio é uma chave de ordenação pouco confiável: duas transições rápidas no mesmo recurso podem ocorrer tão próximas que seus timestamps colidem, e uma comparação de timestamps não tem como desempatar. sequence existe para tornar a ordenação inequívoca — um inteiro estritamente crescente por instância de recurso, de forma que quaisquer dois eventos do mesmo recurso sempre tenham uma ordem definida, não importa quão próximos tenham ocorrido. Regra prática: ordene e deduplique por sequence; exiba e audite por originalCreateDate.

O campo applicationId

Todo payload inclui data.applicationId — a aplicação do SpherePay à qual o evento pertence. Endpoints de webhook são registrados por aplicação, e os eventos só são entregues para recursos pertencentes à aplicação do endpoint. Isso é mais importante quando você opera múltiplas aplicações do SpherePay que compartilham uma mesma URL receptora de webhooks. Registrar a mesma URL em duas aplicações é perfeitamente válido — mas seu handler então recebe eventos de ambas, e o endpoint de cada aplicação tem seu próprio segredo de assinatura. Use applicationId para rotear cada evento ao contexto de aplicação correto no seu sistema (e para selecionar o segredo correto ao verificar assinaturas).
Você encontra o ID de cada aplicação na página Settings do dashboard de integrador do SpherePay.
Última modificação em 11 de agosto de 2026