Criar um endpoint
Registre uma URL sua para receber webhooks — notificações HTTP que a Selectwin envia automaticamente quando algo acontece na sua conta (uma transação aprovada, um saque concluído etc.). Em vez de fica
Registre uma URL sua para receber webhooks — notificações HTTP que a Selectwin envia automaticamente quando algo acontece na sua conta (uma transação aprovada, um saque concluído etc.). Em vez de ficar perguntando à API "já mudou?" (polling), você cria um endpoint, escolhe os eventos que importam e a Selectwin avisa o seu sistema em tempo real.
POST /v1/webhooks/endpoints
Como funciona
Um webhook é o caminho inverso da API: em vez de você chamar a Selectwin, é a Selectwin que chama você. Você expõe uma URL HTTPS pública (o endpoint) e, sempre que ocorre um evento ao qual você se inscreveu, a Selectwin faz um POST para essa URL com o corpo do evento.
O fluxo de criação é direto:
- Você envia o
name, a URL (endpoint) e a lista deeventsque quer receber. - A Selectwin valida a URL e os tipos de evento, cria o recurso e devolve o objeto com um
id(wbe_*). - Junto vem um
secret(whsec_*) — exibido somente nesta resposta de criação. Guarde-o com segurança: é com ele que você verifica a assinatura de cada entrega para garantir que oPOSTrecebido veio mesmo da Selectwin, e não de um impostor. - A partir daí, cada evento inscrito gera uma entrega (uma "tentativa de envio", contabilizada em
shotsQty).
Seu endpoint precisa
- Aceitar requisições HTTP POST.
- Estar acessível publicamente e usar HTTPS (URLs
http://simples não são aceitas para entrega segura). - Responder rápido (idealmente em poucos segundos) com um status 2xx. Faça apenas o mínimo no handler (enfileire e processe depois); lógica pesada inline causa timeout e re-tentativas.
Quando usar
- Você quer reagir a mudanças de estado (pagamento aprovado, recusado, estornado) sem polling. Esta é a forma recomendada — veja Proibição de Polling.
- Você tem um sistema (ERP, backoffice, fila) que precisa ser notificado de eventos da Selectwin.
Quando NÃO criar um novo: se já existe um endpoint para a mesma URL, a criação falha com webhookEndpointUrlExists. Para apenas mudar os eventos inscritos ou a URL de um endpoint existente, use Update em vez de criar outro.
Requisição
Headers
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
SelectKey | Sim | Sua chave de API. Em produção começa com sl_live_; em sandbox, sl_test_. Veja Autenticação. |
Content-Type: application/json | Sim | O corpo é JSON. |
X-Idempotency-Key | Recomendado | Evita criar o mesmo endpoint duas vezes se a requisição for repetida (timeout/retry). Veja Idempotência. |
Nunca use
Authorization: Bearer/Basicpara autenticar na API Selectwin — a autenticação é sempre pelo headerSelectKey. (O campoauthorizationdo corpo, abaixo, é coisa diferente: são os headers que a Selectwin envia ao seu endpoint.)
Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name | string | Sim | Nome descritivo para identificar o endpoint no painel e nas listagens. |
endpoint | string (URI) | Sim | URL HTTPS pública que receberá os POST de eventos. |
events | array de strings | Sim | Tipos de evento aos quais inscrever (ex.: "transaction.approved"). Comece com o mínimo necessário. |
forceActivities | boolean | Não | Se true, envia todos os eventos para este endpoint, independentemente da lista events. Use com cautela. |
authorization | objeto | Não | Cabeçalho de autenticação que a Selectwin incluirá ao chamar o seu endpoint, para o seu servidor validar a origem. Ver abaixo. |
metadata | objeto | Não | Pares chave-valor livres para correlacionar o endpoint com o seu sistema. Volta inalterado nas leituras. |
O objeto authorization (opcional) tem:
| Campo | Tipo | Descrição |
|---|---|---|
authorization.type | string | Tipo do cabeçalho de autorização que a Selectwin enviará ao seu endpoint (ex.: "bearer"). |
authorization.value | string | Valor do cabeçalho (ex.: o token). A Selectwin armazena e reenvia esse valor a cada entrega. |
Dica
authorization adiciona uma camada extra: seu servidor pode rejeitar qualquer POST que não traga o cabeçalho esperado. Mesmo usando-o, continue verificando a assinatura com o secret — veja Verificando Assinaturas.
Exemplo
curl -X POST https://api.selectwin.io/v1/webhooks/endpoints \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: 9b1f2c3a-..." \
-d '{
"name": "My Production Webhook",
"endpoint": "https://myapi.com/webhooks",
"events": [
"transaction.approved",
"transaction.pending"
],
"forceActivities": false,
"authorization": {
"type": "bearer",
"value": "meu-token-secreto"
},
"metadata": {
"team": "billing"
}
}'Resposta
Sucesso (200 OK)
{
"id": "wbe_01hqzvabc",
"name": "My Production Webhook",
"endpoint": "https://webhooks.mydomain.com/selectwin",
"enabled": true,
"authorization": {
"type": "bearer",
"value": "meu-token-secreto"
},
"events": [
"transaction.approved",
"transaction.pending"
],
"secret": "whsec_abcdefghijklmnopqrstuvwxyz123456",
"shotsQty": 0,
"lastDeliveryAt": null,
"metadata": {},
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador do endpoint (wbe_*). Guarde-o para Update, Delete e Analyze. Trate como opaco. |
name | string | Nome descritivo informado. |
endpoint | string | URL que receberá os eventos. |
enabled | boolean | Indica se o endpoint está ativo recebendo entregas. |
authorization | objeto | Cabeçalho de autenticação configurado (type/value), ou ausente se não enviado. |
events | array | Tipos de evento inscritos. |
secret | string | Segredo de assinatura (whsec_*). Só aparece nesta resposta de criação. Use-o para verificar a assinatura das entregas. |
shotsQty | integer | Quantidade de tentativas de envio. Começa em 0. |
lastDeliveryAt | string | null | Data-hora (ISO 8601 UTC) da última entrega; null enquanto nenhum evento foi enviado. |
metadata | objeto | Metadados que você anexou. |
createdAt / updatedAt | string (date-time) | Timestamps em ISO 8601 UTC (...Z). |
Erros
Em caso de falha, o corpo segue o envelope padrão com error.code estável — trate sempre pelo code, nunca pela message. Veja Tratamento de Erros e o Catálogo de Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
webhookEndpointUrlExists | 400 | Já existe um endpoint cadastrado com essa URL. Use Update no existente. |
eventTypeInvalid / webhookEventInvalid | 400 | Um dos tipos de evento informados não existe. |
invalidWebhookEventId / webhookEventIdInvalid | 400 | Identificador de evento de webhook inválido. |
webhookEventsValidationFailed | 400 | A lista events não passou na validação. |
invalidParameters | 400 | Validação genérica de campos (veja error.params para o campo problemático, ex.: endpoint malformado ou name/events ausentes). |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para esta operação. |
unprocessableEntity | 422 | Entidade não processável por regra de negócio. |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes no backoff. Veja API Limits. |
serverError | 500 | Erro interno — repita com backoff; se persistir, contate o suporte. |
Boas práticas
- Guarde o
secretna hora. Ele só aparece aqui. Armazene-o em um secret manager e use-o para verificar a assinatura de cada entrega — veja Verificando Assinaturas. - Salve o
id(wbe_*) retornado: você precisará dele para listar (List), atualizar (Update), remover (Delete) e ver as métricas de entrega (Analyze). - Use
X-Idempotency-Keyna criação para não acabar com dois endpoints idênticos se a requisição for repetida por timeout — veja Idempotência. - Inscreva-se no mínimo de eventos. Comece só com o que você realmente trata (ex.:
transaction.approved) e expanda depois com Update; eviteforceActivities: truea menos que precise mesmo de todos os eventos. - Responda rápido e processe assíncrono. Devolva
2xximediatamente e jogue o processamento pesado para uma fila; handlers lentos viram timeout e re-tentativas. - Trate eventos como possivelmente duplicados. Re-tentativas podem reentregar o mesmo evento; torne seu handler idempotente (deduplique pelo id do evento).
- Sempre HTTPS e URL pública. Endpoints internos ou sem TLS não recebem entregas seguras.
- Monitore a saúde do endpoint via Analyze para detectar entregas falhando antes que virem perda de eventos.
Veja também
- Overview — o recurso Webhook Endpoints e seu ciclo de vida.
- List · Update · Delete · Analyze
- Verificando Assinaturas de Webhook — como validar o
secret. - Proibição de Polling · Convenções · Autenticação
How is this guide?