Visão geral
Uma transação representa uma cobrança na Selectwin: o registro do pagamento de um cliente por cartão, Pix, boleto ou Nupay, com seu valor, status, recebíveis e histórico. Este é o recurso central da A
Uma transação representa uma cobrança na Selectwin: o registro do pagamento de um cliente por cartão, Pix, boleto ou Nupay, com seu valor, status, recebíveis e histórico. Este é o recurso central da API — quase todo fluxo de receita começa criando uma transação e acompanhando seu ciclo de vida até a liquidação, reembolso ou disputa. Esta página explica o modelo do objeto, os estados pelos quais ele passa e todas as operações disponíveis.
Toda chamada usa a base https://api.selectwin.io/v1 e o header de autenticação SelectKey (nunca Authorization: Bearer/Basic). Valores monetários são inteiros em centavos (9900 = R$ 99,00) e datas seguem ISO 8601 em UTC (2026-04-12T17:56:33.000Z). Veja Convenções e Autenticação.
O que é uma transação
Uma transação é a unidade de cobrança da plataforma. Ela amarra, em um único objeto:
- O pagamento — meio (
credit,debit,billet,pix,nupay), valor, parcelas, e os dados específicos do provedor (QR Code Pix, linha digitável do boleto, dígitos do cartão). - O cliente (
customer) — embutido ou referenciado porcus_*. - Os itens (
items) — as linhas do carrinho que somam oamount. - Os recebíveis (
receivables) — quanto e quando você recebe (já descontadas taxas e antecipação), inclusive em parcelas e splits. - O histórico (
timeline) e os eventos de reembolso (refunds) e disputa (disputes).
Cada transação tem um identificador opaco com prefixo tra_ (ex.: tra_01hqzvabc). Não faça parsing do ID — trate-o como string opaca. Você também pode definir um customId/externalReference para reconciliar com o seu sistema.
Centavos, sempre
amount, originalAmount, fees e todos os valores são inteiros em centavos. amount: 5000 é R$ 50,00. O mínimo aceito é 500 (R$ 5,00) e o máximo é 20000000 (R$ 200.000,00).
Modelo do objeto
O exemplo abaixo é uma versão anotada e resumida de uma transação aprovada por cartão de crédito. A resposta completa (com merchant, _links, billing, receivables completos e timeline) aparece em Create e Read.
{
"id": "tra_01hqzvabc", // ID opaco da transação (prefixo tra_)
"customId": "PEDIDO-1042", // seu identificador legível, opcional
"amount": 5000, // valor atual em centavos (após captura parcial/desconto)
"originalAmount": 5500, // valor original antes de descontos/ajustes
"status": "approved", // estado atual (ver tabela de status)
"method": "credit", // meio de pagamento
"currency": "BRL", // ISO 4217 — hoje apenas BRL
"payment": {
"provider": "selectwin",
"version": "1.1",
"refused": null, // motivo da recusa quando status = refused; null se ok
"cardFirstDigits": "411111",
"cardLastDigits": "1111",
"cardBrand": "visa",
"cardRegistered": false,
"installments": 1, // número de parcelas (crédito)
"paidAt": "2026-04-12T17:56:33.000Z",
"invoiceLink": "https://selectwin.io/invoices/tra_01hqzvabc"
// Pix/boleto preenchem aqui: pixQrCodeEmv, pixQrCodeUrl, billetUrl, billetBarcode...
},
"customer": {
"id": "cus_01hqzvabc",
"firstName": "João",
"lastName": "Silva",
"email": "[email protected]",
"document": { "type": "cpf", "number": "12345678901" }
},
"items": [
{
"id": "item_01hqzvabc",
"name": "Premium Plan",
"unitPrice": 5000, // preço unitário em centavos
"quantity": 1,
"currency": "BRL"
}
],
"discount": null, // { value, type, percentageOfAmount } quando há desconto
"externalReference": "order-9981",
"shippable": false,
"spplited": false, // true quando há splits (grafia do campo é "spplited")
"receivables": [ /* parcelas a receber, com fees e expectedOn */ ],
"splits": null, // regras de repasse a terceiros
"refunds": null, // reembolsos registrados
"disputes": null, // disputas/chargebacks
"timeline": [
{
"id": "tml_01hqzvabc",
"message": "Transaction created",
"type": "status",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"metadata": {}, // pares chave/valor seus (máx. 40 chaves)
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:32.000Z"
}Campos principais
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID opaco da transação (tra_*). Imutável; não fazer parsing. |
customId | string | Identificador legível atribuído por você (ex.: número do pedido). |
amount | integer | Valor atual em centavos (após captura parcial, desconto ou ajuste). |
originalAmount | integer | Valor original em centavos, antes de descontos/ajustes. |
status | string | Estado atual da transação (ver tabela de status). |
method | string | Meio de pagamento: credit, debit, billet, pix, nupay. |
currency | string | Código ISO 4217. Atualmente apenas BRL. |
payment | object | Dados do pagamento: dígitos/bandeira do cartão, QR Code Pix, linha do boleto, installments, paidAt, invoiceLink, refused. |
customer | object | Cliente associado (embutido ou referenciado por cus_*). |
items | array | Linhas do carrinho (name, unitPrice, quantity, currency...). Somam o amount. |
discount | object | null | Desconto aplicado: value (centavos), type (flat/percentage), percentageOfAmount. |
billing | object | Endereço de cobrança normalizado. |
shipping | object | null | Dados de entrega, quando houver. |
shippable | boolean | Indica se a transação possui itens entregáveis. |
spplited | boolean | true quando há regras de split. (A grafia do campo na API é spplited.) |
receivables | array | Recebíveis: quanto e quando você recebe (amount, grossAmount, anticipationFee, installmentNumber, expectedOn, status). |
splits | array | null | Regras de repasse a terceiros (recipient, type, value). |
refunds | array | null | Reembolsos registrados (ver Refund). |
disputes | array | null | Disputas/chargebacks (ver Dispute). |
timeline | array | Histórico de eventos: message, type, details, createdAt. |
metadata | object | Pares chave/valor seus (máx. 40 chaves). Veja Metadata. |
merchant | object | Vendedor: name, merchantId, isSubAccount. |
_links | object | Links HATEOAS para ações relacionadas (self, etc.). |
createdAt / updatedAt | string | Datas ISO 8601 UTC de criação e última atualização. |
Status e ciclo de vida
O campo status reflete o estado da transação. Os valores possíveis (enum do contrato) são:
| Status | Descrição |
|---|---|
pre-authorized | Valor reservado no cartão, aguardando captura manual (capture: false). |
pending | Aguardando pagamento (boleto a vencer ou Pix não pago ainda). |
analyzing | Em processamento/validação inicial. |
awaiting | Aguardando uma ação para prosseguir. |
fraud-review | Em análise antifraude. |
approved | Pagamento aprovado e capturado. |
refused | Recusada pelo emissor/adquirente (veja payment.refused e Recusas de Pagamento). |
unauthorized | Pré-autorização não autorizada. |
failed | Falha técnica no processamento. |
canceled | Cancelada (ex.: boleto/Pix expirado ou pré-autorização liberada). |
refunded | Estornada total ou parcialmente (veja Refund). |
dispute | Em disputa, aguardando resolução (veja Dispute). |
chargeback | Contestação concluída como chargeback. |
O diagrama abaixo mostra as transições típicas. Os caminhos dependem do meio e do parâmetro capture:
Não fique consultando em loop
Para saber quando uma transação muda de estado (Pix pago, boleto compensado, captura aprovada), use webhooks, não polling. Pix e boleto são assíncronos: a aprovação pode levar de segundos a dias. Configure callback.webhookUrl na criação ou um endpoint global, e reaja aos eventos transaction.*. Veja Proibição de Polling.
Ciclo de vida dos recebíveis
Cada transação aprovada gera um ou mais recebíveis (receivables) — o dinheiro que efetivamente cairá no seu saldo, já líquido de taxas (fees) e antecipação (anticipationFee), com data prevista em expectedOn. Em parcelamento, há um recebível por parcela (installmentNumber). Os recebíveis têm seu próprio status (scheduled, pending, paid, refunded, dispute, chargeback, canceled) e disparam eventos receivable.*.
Operações
| Operação | Método e caminho | O que faz | Página |
|---|---|---|---|
| Criar | POST /v1/transactions | Cria uma cobrança (cartão, Pix, boleto, Nupay). | Create |
| Consultar | GET /v1/transactions/{transactionId} | Lê uma transação completa pelo ID tra_*. | Read |
| Listar | GET /v1/transactions | Lista paginada com filtros (status, cliente, período, método). | List |
| Capturar | POST /v1/transactions/{transactionId}/capture | Captura valor de uma pré-autorização de cartão. | Capture |
| Reembolsar | POST /v1/transactions/{transactionId}/refund | Estorna total ou parcialmente o valor capturado. | Refund |
| Disputar | POST /v1/transactions/{transactionId}/dispute | Abre/registra disputa com documentos comprobatórios. | Dispute |
Chamada mínima de exemplo
Criar uma cobrança Pix de R$ 50,00:
curl -X POST https://api.selectwin.io/v1/transactions \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-d '{
"amount": 5000,
"payment": { "currency": "BRL", "method": "pix", "pix": { "expiresInMinutes": 30 } },
"geolocation": { "ipAddress": "189.44.12.1" },
"customer": { "id": "cus_01hqzvabc" }
}'A resposta 201 traz o pixQrCodeEmv/pixQrCodeUrl em payment e status: "pending". Os detalhes de cada campo do corpo estão em Create.
Sandbox
No ambiente de testes, sua chave começa com sl_test_ em vez de sl_live_. Use os cartões de teste para simular aprovações e recusas — veja Cartões para Teste.
Captura: automática vs. manual
Para cartão de crédito, o parâmetro payment.capture decide o fluxo:
capture: true— autoriza e captura na mesma chamada. A transação vai direto paraapproved. É o padrão de e-commerce comum.capture: false— apenas autoriza (reserva o valor). A transação ficapre-authorizede você precisa chamar Capture depois para cobrar de fato. Útil para reservas de hotel, aluguel de veículos ou pedidos cujo valor final só se confirma na expedição. Pré-autorizações têm prazo de validade no emissor; se você não capturar a tempo, elas são liberadas (canceled).
A captura pode ser parcial: informe um amount menor que o autorizado em POST .../capture. O saldo não capturado é liberado.
Conceitos e relações
- Customers — uma transação sempre tem um cliente. Reutilize um existente com
customer.id(cus_*) ou envie os dados completos para criação implícita. - Cards — para cobrar um cartão salvo, use
payment.card.idem vez de enviar os dados completos (PAN/CVV). Veja Segurança e PCI. - Items, descontos e splits — os
itemsdefinem oamount(ou envieamountdireto, sem itens);discountajusta o total (flatem centavos oupercentage);splitsrepartem o repasse entre recebedores (type:percentageouflat). - Webhooks — a forma correta de acompanhar mudanças de estado de forma assíncrona. Eventos de transação incluem
transaction.pending,transaction.approved,transaction.refused,transaction.failed,transaction.canceled,transaction.refunded,transaction.chargeback,transaction.dispute,transaction.fraud-review,transaction.pre-authorized,transaction.unauthorizedetransaction.awaiting. Os recebíveis disparamreceivable.created,receivable.scheduled,receivable.paid,receivable.refunded,receivable.dispute,receivable.canceledereceivable.deleted. Veja Webhook Events.
Erros
Trate erros pelo error.code (estável), nunca pela message. Códigos específicos de transações e os transversais mais comuns:
error.code | HTTP | Quando ocorre |
|---|---|---|
transactionIdIsInvalid | 400 | ID informado não tem formato válido de tra_*. |
transactionNotFound | 404 | Nenhuma transação com esse ID. |
transactionCaptureNotProcessable | 409 | Captura não aplicável ao estado atual da transação. |
transactionCaptureNotAllowed | 403 | Captura não permitida para esta transação. |
transactionMethodCaptureNotAllowed | 403 | Meio de pagamento não suporta captura manual. |
traCaptureAmountExceedsAuthorized | 400 | Valor de captura maior que o autorizado. |
traCaptureMinAmount | 400 | Valor de captura abaixo do mínimo permitido. |
transactionRefundNotProcessable | 409 | Reembolso não aplicável ao estado atual. |
transactionDisputeInProcess | 409 | Já existe uma disputa em andamento para a transação. |
missingFeeConfiguration | 422 | Plano de taxas não configurado para a operação. |
paymentProcessingFailed | 503 | Adquirente/serviço de pagamento indisponível — repita com backoff. |
invalidParameters | 400 | Falha de validação genérica (veja error.params). |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão. |
unprocessableEntity | 422 | Regra de negócio violada. |
tooManyRequests | 429 | Limite de requisições excedido (respeite retryAfterMinutes). |
serverError | 500 | Erro interno — tente novamente. |
A lista completa por recurso está em Códigos de Erro; a estrutura do envelope de erro, em Tratamento de Erros.
Boas práticas
- Acompanhe por webhooks, não por polling. Pix e boleto são assíncronos; configure
callback.webhookUrle reaja aos eventostransaction.*/receivable.*. Veja Proibição de Polling. - Guarde o
tra_*e usecustomId/externalReferencepara reconciliar com o seu pedido, sem depender damessage. - Trabalhe sempre em centavos e valide contra os limites (
amountentre500e20000000) antes de enviar. - Trate o ID como opaco — não tente extrair informação do prefixo nem do sufixo.
- Use captura manual para valor incerto (reservas, expedição posterior) e capture o valor real, possivelmente parcial.
- Cobre cartões salvos com
payment.card.id, evitando trafegar PAN/CVV — veja Segurança e PCI. - Decida por
error.codee statusCode: faça retry com backoff em429,5xxepaymentProcessingFailed; trate4xxde negócio sem repetir cegamente. - Guarde provas de entrega (rastreio, nota fiscal) desde já — elas são exigidas se a transação virar uma disputa.
Veja também
- Create — criar uma cobrança (cartão, Pix, boleto, Nupay).
- Read — consultar uma transação completa.
- List — listar e filtrar transações.
- Capture — capturar uma pré-autorização.
- Refund — estornar total ou parcialmente.
- Dispute — abrir/registrar uma disputa.
- Convenções · Autenticação · Paginação · Códigos de Erro
How is this guide?