Capturar uma transação
Captura confirma a cobrança de uma transação de cartão que foi pré-autorizada (o valor ficou reservado no cartão do cliente, mas ainda não foi efetivamente debitado). Use a captura quando seu fluxo de
Captura confirma a cobrança de uma transação de cartão que foi pré-autorizada (o valor ficou reservado no cartão do cliente, mas ainda não foi efetivamente debitado). Use a captura quando seu fluxo de negócio exige reservar fundos primeiro e cobrar depois — por exemplo, ao confirmar a entrega de um pedido ou após apurar o valor final de um serviço. Você pode capturar o valor total ou apenas uma parte do valor autorizado.
POST /v1/transactions/{transactionId}/capture
Como funciona
Um pagamento com cartão pode ser feito em duas etapas (chamado de auth & capture):
- Autorização (pré-autorização): ao criar a transação, o emissor do cartão reserva o valor e devolve a transação com
status: "pre-authorized". Nesse momento nada foi debitado — o limite do cliente apenas fica bloqueado. (Veja Criar transação para como gerar uma pré-autorização.) - Captura: você chama este endpoint para confirmar a cobrança. O servidor envia a captura à adquirente, debita o cartão e move a transação para
status: "approved". Só a partir daí o valor entra no seu fluxo de recebíveis.
Capturar é uma operação síncrona: a resposta 200 já traz a transação no novo estado. A liquidação financeira (quando o dinheiro fica disponível no seu saldo), porém, segue o cronograma dos recebíveis (receivables[]), com expectedOn indicando a data prevista de cada parcela.
Captura total vs. parcial
- Captura total: envie
amountigual ao valor autorizado. - Captura parcial: envie um
amountmenor que o autorizado. O servidor captura apenas esse valor e libera o restante da reserva no cartão do cliente. Útil quando o valor final ficou abaixo do estimado (ex.: o cliente consumiu menos do que a caução).
O amount nunca pode exceder o valor autorizado, nem ficar abaixo do mínimo aceito. Tarifas (fees) também são consideradas: se o valor solicitado, somado às tarifas, ultrapassar o autorizado, a captura é recusada (veja a tabela de erros).
Prazo da pré-autorização
A pré-autorização tem prazo de validade definido pela bandeira/emissor (em geral poucos dias). Após esse prazo a reserva expira e a transação não pode mais ser capturada. Capture assim que sua regra de negócio permitir.
Quando usar
Use a captura quando precisar separar a reserva de fundos da cobrança efetiva:
- Reservas e cauções (hotéis, aluguel de veículos): autorize no check-in/retirada e capture só o valor realmente devido.
- Serviços sob demanda: autorize um valor estimado e capture o valor real após a conclusão.
- Verificação de fundos antes de separar o pedido: garanta que o cliente tem saldo/limite antes de despachar.
Quando NÃO usar:
- Para uma cobrança imediata (autorizar e capturar de uma vez), crie a transação já capturada — não há etapa manual de captura. Veja Criar transação.
- Para estornar um valor já capturado, use o Reembolso — captura não é reversível.
- Métodos como Pix e boleto não usam captura manual; tentar capturá-los retorna
transactionMethodCaptureNotAllowed.
Requisição
Headers
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
SelectKey | Sim | Sua chave de API. Produção começa com sl_live_; sandbox, com sl_test_. Veja Autenticação. |
Content-Type: application/json | Sim | A requisição tem corpo JSON. |
X-Idempotency-Key | Recomendado | Evita captura duplicada se a requisição for repetida (timeout/retry). Veja Idempotência. |
Parâmetros de caminho
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
transactionId | string | Sim | ID da transação a capturar (ex.: tra_01hqzvabc). Trate como opaco — não faça parsing. |
Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
amount | integer (centavos) | Sim | Valor a capturar, em centavos. Deve ser ≥ 500 (R$ 5,00) e ≤ 20000000 (R$ 200.000,00), e não pode exceder o valor autorizado. Para captura total, envie o valor autorizado; para parcial, um valor menor. |
Importante
Diferentemente do reembolso, em que amount é opcional, na captura o amount é obrigatório — informe sempre o valor que deseja confirmar.
Exemplo — captura total
curl -X POST "https://api.selectwin.io/v1/transactions/tra_01hqzvabc/capture" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: cap-tra_01hqzvabc-001" \
-d '{
"amount": 10000
}'Exemplo — captura parcial
Autorizou R$ 100,00, mas só vai cobrar R$ 60,00 (o restante é liberado no cartão):
{
"amount": 6000
}Resposta
200 OK — a resposta é o objeto completo da transação já atualizado: status passa a "approved", amount reflete o valor capturado e os receivables[] são gerados/atualizados com o cronograma de liquidação.
{
"id": "tra_01hqzvabc",
"customId": "PEDIDO-1042",
"amount": 10000,
"originalAmount": 10000,
"status": "approved",
"method": "credit",
"currency": "BRL",
"payment": {
"provider": "selectwin",
"version": "1.1",
"refused": null,
"reusable": false,
"acquirerTransactionNumber": "A1B2C3D4E5",
"cardFirstDigits": "411111",
"cardLastDigits": "1111",
"cardBrand": "visa",
"cardRegistered": false,
"installments": 3,
"expirationDate": null,
"paidAt": "2026-04-12T17:56:33.000Z",
"allowRenewPayment": false,
"invoiceLink": "https://selectwin.io/invoices/tra_01hqzvabc"
},
"discount": null,
"customer": {
"id": "cus_01hqzvabc",
"firstName": "João",
"lastName": "Silva",
"email": "[email protected]",
"document": { "type": "cpf", "number": "12345678901" }
},
"billing": {
"address": {
"id": "addr_01hqzvabc",
"street": "Av. Paulista",
"number": "1000",
"city": "São Paulo",
"state": "SP",
"postcode": "01310-100",
"country": "BR"
}
},
"shipping": null,
"externalReference": "order-9981",
"shippable": false,
"spplited": false,
"items": [
{
"id": "item_01hqzvabc",
"name": "Premium Plan",
"unitPrice": 10000,
"quantity": 1,
"currency": "BRL"
}
],
"receivables": [
{
"id": "rec_01hqzvabc",
"recipient": "bus_1234567890",
"status": "paid",
"amount": 9610,
"grossAmount": 10000,
"anticipationFee": 0,
"installmentNumber": 1,
"currency": "BRL",
"authorizationCode": "654321",
"paidAt": "2026-04-12T17:56:33.000Z",
"expectedOn": "2026-05-12",
"liable": true,
"chargeProcessingFee": true,
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"splits": null,
"refunds": null
}Campos-chave da resposta
| Campo | Tipo | O que indica |
|---|---|---|
status | string | Após capturar, "approved". |
amount | integer | Valor efetivamente capturado, em centavos. |
originalAmount | integer | Valor originalmente autorizado, em centavos. Compare com amount para detectar captura parcial. |
payment.paidAt | date-time | Quando a captura foi confirmada (ISO 8601 UTC). |
receivables[] | array | Recebíveis gerados. grossAmount é o bruto; amount é o líquido (após tarifas); expectedOn é a data prevista de liquidação. |
receivables[].status | string | Estado de cada recebível (ex.: "paid", "pending"). |
Os IDs e datas dos exemplos são ilustrativos. Confie sempre no campo
ide nos timestamps reais da resposta. Veja Convenções.
Erros
Em caso de falha, a resposta segue o envelope de erro padrão com um error.code estável. Trate sempre pelo code, nunca pela message.
error.code | HTTP | Quando ocorre |
|---|---|---|
transactionIdIsInvalid | 400 | O transactionId da URL está malformado. |
traCaptureMinAmount | 400 | amount abaixo do mínimo permitido (500 centavos). |
traCaptureAmountExceedsAuthorized | 400 | amount maior que o valor autorizado. |
traCaptureAmountAfterFeesExceedsAuthorized | 400 | amount + tarifas ultrapassa o valor autorizado. Reduza o amount. |
invalidParameters | 400 | Falha de validação genérica do corpo (veja error.params). |
transactionCaptureNotAllowed | 403 | Sua chave/conta não tem permissão para capturar esta transação. |
transactionMethodCaptureNotAllowed | 403 | O método de pagamento não suporta captura manual (ex.: Pix, boleto). |
transactionNotFound | 404 | Nenhuma transação com esse ID. |
transactionCaptureNotProcessable | 409 | A transação não está em estado capturável (ex.: já capturada, recusada ou pré-autorização expirada). |
missingFeeConfiguration | 422 | Não há configuração de tarifas para calcular a captura. |
traCaptureFailed | 503 | A adquirente recusou/falhou ao processar a captura. Repita com backoff. |
Erros transversais também se aplicam: 401 unauthorized (SelectKey ausente/inválida), 429 tooManyRequests (respeite error.retryAfterMinutes) e 500 serverError. Veja o Catálogo de Códigos de Erro.
Atenção
Captura é irreversível. Uma vez aprovada, a única forma de devolver o valor é via Reembolso, que afeta o seu saldo. Confirme o valor antes de capturar.
Boas práticas
- Confirme o estado antes de capturar. Faça um Read e verifique
status: "pre-authorized"para evitartransactionCaptureNotProcessable. - Capture dentro da validade da pré-autorização. A reserva expira em poucos dias; defina um prazo interno e capture assim que a regra de negócio permitir.
- Use captura parcial quando o valor final for menor que o autorizado — isso libera o saldo restante no cartão do cliente, melhorando a experiência dele.
- Envie
X-Idempotency-Keypara que um retry após timeout não gere captura duplicada. Veja Idempotência. - Trate
503(traCaptureFailed) com backoff exponencial — é uma falha transitória da adquirente, não um erro do seu pedido. - Não fique fazendo polling para saber se capturou. Assine o webhook
transaction.approvedpara reagir à confirmação. Veja Proibição de Polling. - Guarde o
idda transação retornado na criação — ele é a única chave para capturar depois.
Veja também
- Visão geral de Transações — o objeto, estados e todas as operações.
- Criar transação — como gerar uma pré-autorização para capturar depois.
- Reembolsar — devolver um valor já capturado.
- Consultar transação — verificar o estado antes/depois da captura.
- Listar transações · Disputas
- Convenções · Códigos de Erro
How is this guide?