SelectwinDOCS
Endpoints

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:

  1. Você envia o name, a URL (endpoint) e a lista de events que quer receber.
  2. A Selectwin valida a URL e os tipos de evento, cria o recurso e devolve o objeto com um id (wbe_*).
  3. 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 o POST recebido veio mesmo da Selectwin, e não de um impostor.
  4. A partir daí, cada evento inscrito gera uma entrega (uma "tentativa de envio", contabilizada em shotsQty).

Importante

O secret aparece apenas na resposta de criação. Ele não volta em List nem Update. Se você o perder, será preciso rotacioná-lo (criar/atualizar a configuração) — não há como recuperá-lo depois.

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çalhoObrigatórioDescrição
SelectKeySimSua chave de API. Em produção começa com sl_live_; em sandbox, sl_test_. Veja Autenticação.
Content-Type: application/jsonSimO corpo é JSON.
X-Idempotency-KeyRecomendadoEvita criar o mesmo endpoint duas vezes se a requisição for repetida (timeout/retry). Veja Idempotência.

Nunca use Authorization: Bearer/Basic para autenticar na API Selectwin — a autenticação é sempre pelo header SelectKey. (O campo authorization do corpo, abaixo, é coisa diferente: são os headers que a Selectwin envia ao seu endpoint.)

Corpo

CampoTipoObrigatórioDescrição
namestringSimNome descritivo para identificar o endpoint no painel e nas listagens.
endpointstring (URI)SimURL HTTPS pública que receberá os POST de eventos.
eventsarray de stringsSimTipos de evento aos quais inscrever (ex.: "transaction.approved"). Comece com o mínimo necessário.
forceActivitiesbooleanNãoSe true, envia todos os eventos para este endpoint, independentemente da lista events. Use com cautela.
authorizationobjetoNãoCabeçalho de autenticação que a Selectwin incluirá ao chamar o seu endpoint, para o seu servidor validar a origem. Ver abaixo.
metadataobjetoNãoPares chave-valor livres para correlacionar o endpoint com o seu sistema. Volta inalterado nas leituras.

O objeto authorization (opcional) tem:

CampoTipoDescrição
authorization.typestringTipo do cabeçalho de autorização que a Selectwin enviará ao seu endpoint (ex.: "bearer").
authorization.valuestringValor 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"
}
CampoTipoDescrição
idstringIdentificador do endpoint (wbe_*). Guarde-o para Update, Delete e Analyze. Trate como opaco.
namestringNome descritivo informado.
endpointstringURL que receberá os eventos.
enabledbooleanIndica se o endpoint está ativo recebendo entregas.
authorizationobjetoCabeçalho de autenticação configurado (type/value), ou ausente se não enviado.
eventsarrayTipos de evento inscritos.
secretstringSegredo de assinatura (whsec_*). Só aparece nesta resposta de criação. Use-o para verificar a assinatura das entregas.
shotsQtyintegerQuantidade de tentativas de envio. Começa em 0.
lastDeliveryAtstring | nullData-hora (ISO 8601 UTC) da última entrega; null enquanto nenhum evento foi enviado.
metadataobjetoMetadados que você anexou.
createdAt / updatedAtstring (date-time)Timestamps em ISO 8601 UTC (...Z).

Nota

A resposta de criação não inclui os blocos merchant nem _links (HATEOAS) que aparecem nas listagens (List) e em respostas de confirmação (Delete). Também note que failedShotsQty e lastEventSent são campos da listagem, não da criação — aqui o campo de último envio é lastDeliveryAt.

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.codeHTTPQuando ocorre
webhookEndpointUrlExists400Já existe um endpoint cadastrado com essa URL. Use Update no existente.
eventTypeInvalid / webhookEventInvalid400Um dos tipos de evento informados não existe.
invalidWebhookEventId / webhookEventIdInvalid400Identificador de evento de webhook inválido.
webhookEventsValidationFailed400A lista events não passou na validação.
invalidParameters400Validação genérica de campos (veja error.params para o campo problemático, ex.: endpoint malformado ou name/events ausentes).
unauthorized401SelectKey ausente, inválida ou revogada.
forbidden403Autenticado, mas sem permissão para esta operação.
unprocessableEntity422Entidade não processável por regra de negócio.
tooManyRequests429Limite de requisições excedido — respeite error.retryAfterMinutes no backoff. Veja API Limits.
serverError500Erro interno — repita com backoff; se persistir, contate o suporte.

Boas práticas

  1. Guarde o secret na hora. Ele só aparece aqui. Armazene-o em um secret manager e use-o para verificar a assinatura de cada entrega — veja Verificando Assinaturas.
  2. Salve o id (wbe_*) retornado: você precisará dele para listar (List), atualizar (Update), remover (Delete) e ver as métricas de entrega (Analyze).
  3. Use X-Idempotency-Key na criação para não acabar com dois endpoints idênticos se a requisição for repetida por timeout — veja Idempotência.
  4. Inscreva-se no mínimo de eventos. Comece só com o que você realmente trata (ex.: transaction.approved) e expanda depois com Update; evite forceActivities: true a menos que precise mesmo de todos os eventos.
  5. Responda rápido e processe assíncrono. Devolva 2xx imediatamente e jogue o processamento pesado para uma fila; handlers lentos viram timeout e re-tentativas.
  6. Trate eventos como possivelmente duplicados. Re-tentativas podem reentregar o mesmo evento; torne seu handler idempotente (deduplique pelo id do evento).
  7. Sempre HTTPS e URL pública. Endpoints internos ou sem TLS não recebem entregas seguras.
  8. Monitore a saúde do endpoint via Analyze para detectar entregas falhando antes que virem perda de eventos.

Veja também

How is this guide?

On this page