SelectwinDOCS
Eventos

Catálogo de eventos

Esta página é a referência dos tipos de evento que a Selectwin pode entregar aos seus webhook endpoints. Um evento é uma notificação gerada quando algo muda na plataforma (ex.: uma transação é aprovad

Esta página é a referência dos tipos de evento que a Selectwin pode entregar aos seus webhook endpoints. Um evento é uma notificação gerada quando algo muda na plataforma (ex.: uma transação é aprovada). Cada tipo tem um nome no formato recurso.acao — por exemplo transaction.approved — e é exatamente esse nome que você assina no campo events[] ao criar um endpoint.

Use esta página como dicionário: descubra qual evento corresponde à mudança que você quer reagir, copie o nome literal e assine-o no seu endpoint. Os valores aqui são os únicos aceitos pelo contrato — qualquer string fora desta lista é rejeitada na validação (veja Erros).

Como a nomenclatura funciona

Todo tipo de evento segue o padrão recurso.estado (ou recurso.acao), tudo em minúsculas:

  • O prefixo é o recurso afetado: transaction, customer, subscription, etc.
  • O sufixo é o que aconteceu: normalmente o novo estado do recurso (approved, paid, canceled) ou a operação realizada (created, updated, deleted).
transaction . approved
└─ recurso ─┘ └─ estado ┘

Nota

Trate o nome do evento como um identificador opaco e estável: compare a string inteira (event.type === "transaction.approved"), não tente derivar lógica fatiando o ponto. A lista evolui — novos tipos podem ser adicionados a qualquer momento, então o seu código deve ignorar com segurança tipos que não conhece, em vez de quebrar.

O envelope do evento

Toda entrega chega ao seu endpoint como um POST com um corpo JSON (o envelope) e o cabeçalho de assinatura X-Selectwin-Signature. O envelope identifica qual evento ocorreu e carrega o recurso afetado no momento do evento:

{
  "id": "wbh_01hqzvabc",
  "type": "transaction.approved",
  "resource": "transaction",
  "resourceId": "tra_987654321",
  "createdAt": "2026-04-12T17:56:33.000Z",
  "data": {
    "id": "tra_987654321",
    "amount": 1500,
    "status": "approved"
  }
}
CampoTipoDescrição
idstringID público do evento (prefixo wbh_). Use-o para deduplicar — reentregas repetem o mesmo id.
typestringO tipo do evento (uma das linhas das tabelas abaixo).
resourcestringO tipo do recurso afetado (ex.: transaction, customer).
resourceIdstringID público do recurso afetado (prefixo do recurso, ex.: tra_).
createdAtstring (ISO 8601 UTC)Quando o evento foi gerado. Sempre em UTC, com sufixo Z.
dataobjectO objeto do recurso no momento do evento — mesma forma da leitura individual do recurso (GET .../{id}).

Importante

Valores monetários em data (ex.: amount) são inteiros em centavos (1500 = R$ 15,00) e timestamps são ISO 8601 UTC. Trate os IDs como strings opacas. Veja Convenções da API.

O envelope acima é o que chega ao seu servidor. Quando você lista eventos pela API (GET /v1/webhooks/events), cada item traz metadados adicionais de entrega — attempts, lastAttempt, dispatches[], etc. — e o payload entregue aparece como requestPayload. Veja Listar Eventos.

Ciclo de vida da entrega

Entender o ciclo ajuda a escolher os eventos certos e a tratar reentregas:

  • A Selectwin aguarda sua resposta por até 15 segundos. Responda 2xx rápido e processe de forma assíncrona (fila). Veja Proibição de Polling.
  • Falhas são reentregues com backoff. Como o mesmo evento pode chegar mais de uma vez, deduplique pelo id (wbh_...).
  • Eventos que esgotam as retentativas automáticas podem ser reenviados manualmente — veja Reenviar Evento.

Catálogo completo por recurso

As tabelas abaixo listam todos os tipos de evento, agrupados pelo recurso. Os nomes na coluna Evento são os valores literais aceitos em events[].

Transações

EventoQuando
transaction.createdTransação criada
transaction.pendingAguardando pagamento (boleto/PIX) ou processamento
transaction.pre-authorizedPré-autorização aprovada (captura manual)
transaction.approvedTransação aprovada
transaction.refusedTransação recusada
transaction.unauthorizedPré-autorização não autorizada
transaction.awaitingAguardando ação/análise
transaction.failedTentativa de transação falhou
transaction.canceledTransação cancelada
transaction.disputeTransação em disputa
transaction.chargebackChargeback registrado
transaction.refundedTransação estornada (total/parcial)
transaction.fraud-reviewEm análise de fraude

Recebíveis

EventoQuando
receivable.createdRecebível gerado
receivable.scheduledRecebível agendado para liberação
receivable.pendingAguardando liquidação
receivable.paidRecebível liberado/pago
receivable.canceledRecebível cancelado
receivable.deletedRecebível removido
receivable.refundedRecebível reembolsado
receivable.disputeDisputa afeta o recebível
receivable.chargebackChargeback afeta o recebível

Assinaturas

EventoQuando
subscription.createdAssinatura criada
subscription.activeAssinatura ativada (em dia)
subscription.trialingEntrou em período de trial
subscription.pastdueCobrança de ciclo falhou; em retentativa
subscription.unpaidRetentativas esgotadas sem pagamento
subscription.pausedAssinatura pausada
subscription.renewalCiclo renovado/cobrado com sucesso
subscription.reactivatedReativada após pausa/inadimplência
subscription.canceledAssinatura cancelada
subscription.expiredAssinatura expirada

Clientes

EventoQuando
customer.createdCliente criado
customer.updatedCliente atualizado
customer.deletedCliente removido

Cartões

EventoQuando
card.createdCartão tokenizado/registrado
card.updatedCartão atualizado
card.deletedCartão removido
card.expiredCartão expirado

Endereços

EventoQuando
address.createdEndereço criado
address.updatedEndereço atualizado
address.deletedEndereço removido

Carteiras

EventoQuando
wallet.createdCarteira criada
wallet.pendingCarteira aguardando validação
wallet.enabledCarteira ativada
wallet.disabledCarteira desativada
wallet.rejectedCarteira rejeitada na validação
wallet.deletedCarteira removida

Saques (Withdrawals)

EventoQuando
withdrawal.createdSaque criado
withdrawal.pendingSaque pendente
withdrawal.analysisSaque em análise
withdrawal.processingSaque em processamento
withdrawal.confirmedSaque confirmado
withdrawal.refusedSaque recusado
withdrawal.canceledSaque cancelado

Webhooks

EventoQuando
webhook.createdUm novo webhook endpoint foi configurado

Como assinar eventos

Você escolhe quais eventos receber no campo events[] ao criar (ou atualizar) um webhook endpoint. O campo é um array das strings literais deste catálogo:

curl -X POST https://api.selectwin.io/v1/webhooks/endpoints \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Webhook MyDomain",
    "endpoint": "https://webhooks.mydomain.com/selectwin",
    "events": [
      "transaction.approved",
      "transaction.refused",
      "transaction.refunded"
    ]
  }'

Em sandbox, sua chave começa com sl_test_. Nunca use Authorization: Bearer/Basic — a Selectwin autentica via cabeçalho SelectKey. Veja Autenticação. O passo a passo completo da criação está em Criar Webhook Endpoint.

Consumindo e roteando eventos

No seu servidor, verifique a assinatura primeiro (ver Verificando Assinaturas) e então roteie pelo type. Deduplique pelo id e ignore tipos desconhecidos:

const seen = new Set(); // em produção, use um store persistente (Redis, DB)

app.post('/webhooks/selectwin', verifySignature, (req, res) => {
  const event = req.body; // já validado pela assinatura

  // 1) Idempotência: descarte reentregas do mesmo evento
  if (seen.has(event.id)) return res.status(200).send('ok (dup)');
  seen.add(event.id);

  // 2) Responda 2xx rápido; enfileire o trabalho pesado
  enqueue(event);
  res.status(200).send('ok');
});

function handle(event) {
  switch (event.type) {
    case 'transaction.approved':
      return fulfillOrder(event.resourceId, event.data); // amount em centavos
    case 'transaction.refused':
    case 'transaction.failed':
      return notifyPaymentProblem(event.resourceId);
    case 'transaction.refunded':
      return reverseFulfillment(event.resourceId);
    case 'subscription.canceled':
      return revokeAccess(event.data);
    default:
      return; // tipo não tratado — ignore com segurança
  }
}

Erros

Os erros abaixo aparecem ao registrar eventos inválidos em um endpoint (campo events[]). Trate sempre pelo error.code estável, nunca pela message — veja Tratamento de Erros e o Catálogo de Códigos de Erro.

error.codeHTTPQuando ocorre
eventTypeInvalid / webhookEventInvalid400Um tipo de evento informado não existe neste catálogo
webhookEventsValidationFailed400A lista events[] falhou na validação (ex.: vazia ou com itens inválidos)
invalidWebhookEventId / webhookEventIdInvalid400ID de evento inválido (ex.: ao reenviar um evento, Resend)
invalidParameters400Validação genérica de campos (veja error.params)
unauthorized401SelectKey ausente, inválida ou revogada
forbidden403Autenticado, mas sem permissão para a operação
tooManyRequests429Limite de requisições excedido (respeite error.retryAfterMinutes)
serverError500Erro interno — repita com backoff; se persistir, contate o suporte

Boas práticas

  • Assine a menor lista de eventos que você precisa. Cada evento extra gera tráfego e ruído no seu endpoint.
  • Deduplique pelo id (wbh_...). Reentregas e backoff podem repetir um evento; processe cada id uma única vez.
  • Responda 2xx em ≤ 15s e processe de forma assíncrona (fila). Caso contrário, a entrega é cancelada e reagendada.
  • Ignore tipos desconhecidos com segurança. O catálogo cresce; um default que não quebra mantém sua integração resiliente a novos eventos.
  • Reaja ao estado, não infira. Use o evento de estado certo (ex.: transaction.approved para liberar o pedido, transaction.refunded para reverter) em vez de assumir transições.
  • Verifique a assinatura antes de confiar no payload. Qualquer um que descubra sua URL pode forjar requisições — veja Verificando Assinaturas.
  • Não faça parsing do nome do evento. Compare a string inteira; o ponto não é uma garantia de estrutura para sua lógica.

Veja também

How is this guide?

On this page