Sphere Blog
6 min

Conheça o Webhooks v2

Entrega de eventos assinada e sequenciada para cada mudança de estado na verificação de clientes e nas transferências.

Written by
Sphere Team
Published on
August 12, 2026

A movimentação de dinheiro é assíncrona, e os momentos importantes acontecem no tempo de outra pessoa. Uma análise de compliance é concluída. Um banco de destino faz a liquidação.

Acompanhar o progresso de uma transferência na Sphere costumava significar fazer consultas periódicas. A cobertura de webhooks não incluía o status das transferências, então as equipes escreviam o loop, o GET, uma comparação com o que havia sido armazenado da última vez e o tratamento de erros para quando a requisição falhava. Funcionava, mas impunha um limite fixo à rapidez com que você podia reagir e uma carga constante sobre uma API que, na maior parte do tempo, não tinha nada de novo a dizer.

O Webhooks v2 já está disponível. O mecanismo de entrega foi reconstruído, o catálogo de eventos é novo e os endpoints agora podem ser gerenciados pela API. Dezoito eventos cobrem os ciclos de vida de verificação de clientes e de transferências, e a Sphere entrega cada um deles ao seu endpoint no momento em que acontece. Seu handler agora é executado quando o estado muda, e não no seu intervalo de polling.

A cobertura é intencional: um evento em cada etapa do ciclo de vida da transferência, incluindo o momento em que um depósito chega, e um evento em cada etapa da verificação de clientes.

O que já está disponível

Antes, as transferências só podiam ser acompanhadas chamando GET /v2/transfer/{id} periodicamente. Agora existem 14 eventos de transferência que cobrem toda a máquina de estados: transfer.created, transfer.fundsReceived, transfer.processing e transfer.succeeded no fluxo de sucesso, e um evento distinto para cada resultado de falha, devolução e reembolso, incluindo transfer.failed, transfer.returned, transfer.refunded e transfer.expired.

Quatro eventos cobrem a verificação de clientes. customer.created é disparado uma vez, quando o registro é criado. customer.pending, customer.approved e customer.rejected são disparados uma vez por perfil de verificação a cada transição, então um cliente com dois perfis gera dois fluxos de eventos independentes.

Você faz a assinatura por endpoint, seja de nomes de eventos específicos ou de um curinga como transfer.*.

Por que o payload é pequeno

Há uma decisão de design que vale a pena explicar aqui, porque ela define como você vai escrever seu handler.

O corpo de um webhook poderia trazer o recurso inteiro. Optamos por não fazer isso, e essa escolha define como você escreve seu handler. Cada evento traz o ID do recurso, o status anterior e o novo com seus timestamps, os IDs relacionais necessários para associar o evento aos seus próprios registros e uma causa estruturada quando algo falha:
‍
{
 "id": "event_01HXP9ZK7Q4ABC123",
 "type": "transfer.succeeded",
 "apiVersion": "v2",
 "livemode": true,
 "sequence": 5,
 "data": {
   "id": "payout_d243ab2b1de4447d8a046d87fefe58cf",
   "type": "transfer",
   "customerId": "customer_f31121c389624d3697cbf3ea8830b7a4",
   "applicationId": "application_26b980e989d94e6d975144f7e21f282f",
   "transferType": "oneTimeTransfer",
   "previousStatus": "processing",
   "previousStatusAt": "2026-04-23T14:04:30.000Z",
   "status": "succeeded",
   "statusAt": "2026-04-23T14:05:30.000Z",
   "cause": null
 }
}


O raciocínio é que a maioria dos handlers não precisa do objeto completo. Atualizar uma linha ou notificar um canal de operações funciona apenas com o corpo. Um payload grande significaria enviar, a cada entrega, campos que você nunca lê. Quando sua lógica precisar do recurso completo, você faz um GET nele. Preferimos que você faça essa chamada de forma deliberada a pagar por ela em cada evento.

As falhas dizem o porquê

Todo evento de falha terminal traz uma cause estruturada. Um cliente rejeitado chega com um valor como identity_verification_failure, document_mismatch, incomplete_information ou restricted_jurisdiction. Uma transferência com falha chega com insufficient_funds, recipient_bank_rejection, invalid_recipient ou quote_expired.

São valores de enum, não texto livre. Você pode criar ramificações e rotear com base neles sem escrever um parser para strings que talvez reformulemos no futuro.

A ordenação é um único inteiro

Redes reordenam as coisas, e um sistema de webhooks que ignora isso joga o problema para você.

Todo evento traz um sequence: um inteiro monotonicamente crescente, com escopo no recurso individual e no que o seu endpoint assina. Eventos de tipos que você não assinou não o incrementam, então você nunca verá uma lacuna e ficará se perguntando o que perdeu.

O padrão de reconciliação é uma única comparação com uma coluna em uma linha que você já mantém:

if (event.sequence <= customer.lastSphereSequence) return ack();

Sem contador global, sem serviço de ordenação, sem fila própria. Ocasionalmente, você pode receber o mesmo evento mais de uma vez; o id do evento é estável em todas as entregas do mesmo evento e é a sua chave de idempotência.

Como verificar uma entrega

Cada endpoint tem seu próprio segredo de assinatura, retornado uma única vez quando você cria o endpoint e nunca mais. Toda entrega é assinada com HMAC-SHA256 sobre o timestamp e o corpo bruto:

const expected = crypto.createHmac("sha256", secret)
 .update(`${headers["sphere-timestamp"]}.${rawBody}`)
 .digest("hex");

Compare esse valor com o esquema v1= no header Sphere-Signature e rejeite qualquer entrega cujo Sphere-Timestamp tenha mais de cinco minutos. Faça a verificação sobre os bytes brutos, e não sobre um corpo re-serializado. Uma ida e volta por JSON vai alterá-los, e a assinatura não vai bater.

Retorne um 2xx em até quinze segundos e consideraremos o evento entregue.

Implementações de verificação prontas para copiar e colar em TypeScript, Python e Go estão na documentação.

Gerenciando endpoints

Registre um endpoint com POST /v2/webhook-endpoints, listando os eventos que você deseja. Cada conta pode ter até seis.

GET /v2/events retorna o que enviamos para você. Filtre por endpoint, tipo de evento, status de entrega ou intervalo de datas, e abra qualquer evento para ver cada tentativa de entrega com seu código de resposta e latência. São os mesmos dados que vão alimentar o dashboard, expostos primeiro como API para que você possa construir reconciliação e alertas diretamente sobre eles.

Já usa webhooks?

Seus endpoints existentes continuam funcionando. O Webhooks v2 é uma superfície separada e versionada. Nada é ativado por baixo dos seus endpoints existentes. Crie um endpoint v2 pela API, valide-o com o seu handler e desative o antigo quando estiver pronto. Os endpoints existentes terão suporte por pelo menos doze meses, e daremos um aviso claro com bastante antecedência antes que isso mude. As etapas de migração estão na documentação.

O que vem a seguir

Um dashboard de webhooks chega logo depois deste lançamento. Ele vai oferecer o log de eventos como uma interface navegável, um botão para disparar eventos de teste no seu endpoint antes de entrar em produção e replay com um clique para qualquer entrega que não tenha chegado. O replay chega junto com ele.

Depois disso: novas tentativas automáticas e monitoramento da saúde dos endpoints, para que uma breve indisponibilidade do seu lado se resolva sem que ninguém precise intervir. Em seguida, atualização de endpoints sem precisar recriá-los, rotação de segredos, uma API de replay e SDKs oficiais para TypeScript, Python e Go. Eventos de documentos e de serviços virão depois.

Comece aqui
Dúvidas? Fale com support@spherepay.co.

About the author

Sphere Team

Sphere Team

Insights and research

Sphere's team sits at the intersection of two worlds that rarely hire from each other: regulated payments and blockchain infrastructure. Founded in 2022, Sphere was built to modernize cross-border settlement for businesses and institutions by pairing stablecoin rails with licensed financial plumbing.Company leadership is a mix of fintech unicorn alumni, bank and payments-native engineers, and compliance veterans with experience licensing first-of-their-kind regulated entities in emerging industries.

The team also publishes original research on stablecoins and their role in the global financial system, contributing to the policy conversation shaping the space.

Operating experience runs deepest in LATAM and the Americas, with licensing and corridor work extending into APAC and beyond.

Subscribe to Sphere Blog

No spam. Just the latest releases and tips, interesting articles, and exclusive interviews in your inbox every week.

Vamos construir o futuro das finanças com mais rapidez

Junte-se às empresas que já estão crescendo com o Sphere.

Comece
Leia documentos