Visão geral
Um Webhook Endpoint é uma URL do seu sistema que a Selectwin registra para entregar notificações automáticas (chamadas webhooks) sempre que algo acontece na sua conta — uma transação aprovada, um saqu
Um Webhook Endpoint é uma URL do seu sistema que a Selectwin registra para entregar notificações automáticas (chamadas webhooks) sempre que algo acontece na sua conta — uma transação aprovada, um saque processado, e assim por diante. Em vez de você ficar consultando a API repetidamente para saber se algo mudou (polling), a Selectwin faz uma requisição POST para a sua URL no instante em que o evento ocorre. Esta página explica o que é o recurso, como ele funciona por baixo e quais operações existem para gerenciá-lo.
Um webhook (literalmente "gancho web") é uma notificação que um sistema envia a outro via HTTP assim que um fato relevante acontece. O endpoint é o "gancho" do seu lado que recebe essa chamada.
O papel do endpoint no produto
É útil separar três conceitos que andam juntos mas são recursos distintos na API:
| Conceito | O que é | Prefixo de ID | Recurso |
|---|---|---|---|
| Endpoint | A configuração da URL que recebe os webhooks (esta seção) | wbe_ | Webhook Endpoints |
| Evento | Um fato que aconteceu na sua conta e gerou uma notificação (ex.: transaction.approved) | wbh_ | Webhook Events |
| Dispatch | Uma tentativa individual de entregar um evento a um endpoint | wdi_ | Webhook Dispatches |
Em palavras: você cria endpoints, a Selectwin gera eventos conforme sua conta opera, e para cada evento que casa com a inscrição de um endpoint ela faz um ou mais dispatches (tentativas de entrega) para aquela URL.
O modelo do objeto
Um endpoint de webhook é representado pelo objeto abaixo. Os campos vêm das respostas reais da API (create, read, update e list).
{
"id": "wbe_01hqzvabc", // ID opaco do endpoint (prefixo wbe_)
"name": "Webhook MyDomain", // nome de exibição que você escolhe
"endpoint": "https://webhooks.mydomain.com/selectwin", // sua URL HTTPS que recebe os POSTs
"enabled": true, // o endpoint está ativo e recebendo eventos?
"authorization": { // cabeçalho de auth que a Selectwin envia ao seu servidor
"type": "bearer", // tipo do cabeçalho (ex.: "bearer", "basic")
"value": "sl_wh_***" // valor — mascarado nas leituras
},
"events": [ // tipos de evento a que este endpoint está inscrito
"transaction.approved",
"transaction.pending"
],
"shotsQty": 3068, // total de tentativas de entrega já feitas
"lastDeliveryAt": "2026-04-12T17:56:33.000Z", // momento da última entrega (ISO 8601 UTC)
"metadata": { "team": "ops" }, // objeto livre seu, devolvido como veio
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2025-01-26T20:18:05.000Z"
}Campos do objeto
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador opaco do endpoint (prefixo wbe_). Trate como string; não faça parsing. |
name | string | Nome de exibição que você define, para identificar o endpoint no painel e nas listagens. |
endpoint | string (URI) | A URL HTTPS do seu sistema que recebe as requisições POST. |
enabled | boolean | Indica se o endpoint está ativo. Um endpoint que falha repetidamente pode ser desativado pela Selectwin. |
authorization | objeto | null | Cabeçalho de autenticação que a Selectwin inclui ao chamar a sua URL. Veja autorização de saída. |
authorization.type | string | Tipo do cabeçalho (ex.: "bearer", "basic"). |
authorization.value | string | Valor do cabeçalho. Mascarado (ex.: sl_wh_***) nas respostas de leitura. |
events | array<string> | Tipos de evento a que o endpoint está inscrito (ex.: transaction.approved). Veja o catálogo de eventos. |
secret | string | Segredo de assinatura (prefixo whsec_). Aparece apenas na resposta do create — guarde-o na hora. |
shotsQty | integer | Total acumulado de tentativas de entrega feitas a este endpoint. |
failedShotsQty | integer | Total de tentativas que falharam. Presente nas respostas de lista. |
lastDeliveryAt | string | null | Data-hora da última entrega (ISO 8601 UTC). Aparece nas respostas de single (create/read/update); null se ainda não houve entrega. |
lastEventSent | string | null | Equivalente nas respostas de lista: data-hora do último evento enviado. |
metadata | objeto | Objeto livre (chave→valor) que você anexa; é devolvido como veio. Útil para correlacionar com o seu sistema. |
createdAt | string | Data-hora de criação (ISO 8601 UTC). |
updatedAt | string | Data-hora da última atualização (ISO 8601 UTC). |
Nota
Os nomes de campo seguem as convenções globais: camelCase, datas em ISO 8601 UTC (...Z) e IDs opacos no formato prefixo_valor. Repare em duas diferenças sutis entre formatos de resposta: o objeto de lista traz failedShotsQty e lastEventSent, enquanto os de single (create/read/update) trazem lastDeliveryAt. E secret só existe na resposta do create.
Como funciona a entrega
Quando um fato relevante acontece na sua conta, a Selectwin avalia cada endpoint inscrito naquele tipo de evento e dispara a entrega:
Pontos importantes do mecanismo:
- Sempre por HTTP
POST, com corpo JSON, para aendpointconfigurada. - Responda rápido com
2xx. Seu servidor deve confirmar o recebimento (200 ou 202) em poucos segundos e processar o conteúdo de forma assíncrona. Respostas lentas ou fora da faixa2xxsão tratadas como falha e geram nova tentativa. - Reentrega com backoff. Falhas temporárias são repetidas automaticamente; cada tentativa conta em
shotsQty/failedShotsQty. Falhas persistentes podem levar a Selectwin a marcar o endpoint comoenabled: false. - Inscrição por tipo. O endpoint só recebe os tipos listados em
events. Para receber tudo independentemente da inscrição, há a flagforceActivitiesno create/update.
Ciclo de vida do endpoint
Idempotência do seu lado
Como há reentregas, o mesmo evento pode chegar mais de uma vez ao seu endpoint. Torne o seu processamento idempotente: identifique o evento pelo id (prefixo wbh_) do payload e ignore os que já foram processados. Isso evita efeitos colaterais duplicados (ex.: dar baixa duas vezes no mesmo pedido).
Autorização de saída do seu endpoint
O campo authorization configura um cabeçalho que a Selectwin envia ao chamar a sua URL — é como o seu servidor reconhece que a chamada veio da Selectwin (não é a sua SelectKey, que serve para você chamar a API).
authorization.type— tipo do cabeçalho (ex.:"bearer","basic").authorization.value— o valor; nas leituras vem mascarado (sl_wh_***).
Dica
Além desse cabeçalho, a forma mais robusta de garantir a origem é verificar a assinatura de cada webhook com o secret (whsec_...) devolvido na criação. Veja Verificando Assinaturas de Webhook.
Operações disponíveis
Todas as chamadas usam a base https://api.selectwin.io/v1 e exigem o cabeçalho de autenticação SelectKey (veja Autenticação).
| Operação | Método e caminho | Página |
|---|---|---|
| Criar endpoint | POST /v1/webhooks/endpoints | Create |
| Listar endpoints | GET /v1/webhooks/endpoints | List |
| Atualizar endpoint | PUT /v1/webhooks/endpoints/{endpointId} | Update |
| Excluir endpoint | DELETE /v1/webhooks/endpoints/{endpointId} | Delete |
| Analytics de entregas | GET /v1/webhooks/endpoints/{endpointId}/analytics | Analyze |
O parâmetro de caminho é
endpointId(ex.:wbe_01hqzvabc). As respostas de lista, delete e analytics incluemmerchante_links(HATEOAS); as respostas de single (create/read/update) trazem só o objeto do endpoint.
Erros
A tabela abaixo lista os error.code específicos deste recurso. Trate sempre pelo error.code (estável), nunca pela message. Para o envelope de erro e os códigos transversais (401, 403, 422, 429, 500), veja o Catálogo de Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
webhookEndpointUrlExists | 400 | Já existe um endpoint com essa mesma URL. |
invalidWebhookEndpointId | 400 | O endpointId do caminho é inválido ou malformado. |
eventTypeInvalid / webhookEventInvalid | 400 | Um dos tipos em events não é um tipo de evento válido. |
invalidWebhookEventId / webhookEventIdInvalid | 400 | Referência a um ID de evento inválido. |
webhookEventsValidationFailed | 400 | A lista de events falhou na validação. |
invalidParameters | 400 | Falha de validação genérica (veja error.params para os campos). |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticada, mas sem permissão para a operação. |
notFound | 404 | Endpoint não encontrado (no read/update/delete/analytics). |
tooManyRequests | 429 | Limite de requisições excedido — repita com backoff. |
serverError | 500 | Erro interno — tente novamente; se persistir, contate o suporte. |
Boas práticas
- Use HTTPS sempre. A
endpointprecisa ser uma URL pública e segura; dados de eventos trafegam por ela. - Responda
2xxem segundos e processe depois. Confirme o recebimento rápido e empurre o trabalho pesado para uma fila/processamento assíncrono, evitando timeouts e reentregas. - Seja idempotente. Deduplica eventos pelo
id(wbh_) do payload, já que reentregas são esperadas. - Verifique a autenticidade. Cheque o cabeçalho de
authorizatione, melhor ainda, valide a assinatura com osecret— veja Verificando Assinaturas. - Guarde o
secretna criação. Ele só vem na resposta do create; não há como recuperá-lo depois. - Inscreva-se só no que precisa. Comece com poucos tipos em
eventse expanda conforme a necessidade, para reduzir tráfego e ruído. - Monitore a saúde. Acompanhe
shotsQty/failedShotsQtye use a página de Analyze para detectar entregas falhando antes que o endpoint seja desativado. - Salve o
id(wbe_). Você vai precisar dele para atualizar, consultar, excluir e ver analytics.
Veja também
- Create — registrar um novo endpoint
- List — listar e filtrar endpoints
- Update — alterar URL, eventos e autorização
- Delete — remover um endpoint
- Analyze — estatísticas de entrega de um endpoint
- Webhook Events — os eventos entregues e o catálogo de tipos
- Webhook Dispatches — tentativas individuais de entrega
- Verificando Assinaturas de Webhook — validar a origem com o
secret - Convenções da API · Proibição de Polling · Catálogo de Códigos de Erro
How is this guide?