Pré-autorize e capture depois
Reserve o valor no cartão de crédito do comprador agora e decida em até 7 dias se cobra (captura) ou libera a reserva (cancelamento).
Na pré-autorização, a cobrança acontece em dois tempos. Primeiro você autoriza: o banco do comprador confirma que o cartão é válido e separa o valor do limite, sem cobrar nada. Depois você captura, e só aí o comprador é cobrado, ou cancela, e a reserva some do limite dele. Use quando o valor final só fica certo depois do pedido: estoque confirmado, análise antifraude manual, reserva de serviço, pedido sob encomenda.
Habilitação por conta
A pré-autorização está disponível no sandbox e em produção para contas habilitadas pela equipe de integração. Sem a habilitação, o create responde 403 capture_not_enabled_for_merchant. Peça a habilitação nos dois ambientes e valide o fluxo inteiro no sandbox, com os dados de teste, antes de produzir.
Como funciona
1 de 5
Autorize sem cobrar
Seu servidor cria a cobrança com captureMethod: Manual. A Accelerazione pede ao banco do comprador só a autorização, e a cobrança volta RequiresCapture.
Em resumo:
- Seu servidor cria a cobrança com
captureMethod: "Manual". A Accelerazione pede ao banco do comprador só a autorização, e a cobrança voltastatus: "RequiresCapture". - O valor fica reservado no limite do comprador até
captureBefore, 7 dias depois da autorização. Nada foi cobrado. - Caminho A:
POST /api/v1/paymentintents/{id}/capturecobra o valor. A cobrança viraSucceedede chegapayment_intent.succeeded. - Caminho B:
POST /api/v1/paymentintents/{id}/cancellibera a reserva sem cobrar. A cobrança viraCancelede chegapayment_intent.canceled. - Sem decisão até
captureBefore, a Accelerazione libera a reserva sozinha. A cobrança viraCanceledcomcancellationReason: "expired".
Antes de começar
A pré-autorização vale para um subconjunto da cobrança com cartão. A cobrança precisa ter:
- Crédito, com exatamente um item em
paymentMethods. Débito não é aceito. - Uma parcela:
paymentMethodOptions.creditCard.installmentsigual a1ou ausente. - Sem 3DS: não envie
threeDs.sessionTokennemthreeDSecure: "required". Se a política de aceitação exigir autenticação para aquele cartão, a cobrança é recusada comTHREE_DS_DEFERRED_CAPTURE_NOT_SUPPORTED; nesse caso, cobre com captura automática. - Confirmação imediata:
deferConfirmationausente oufalse. - Conta habilitada para pré-autorização.
O resto da cobrança é igual ao da cobrança com cartão: cartão aberto ou card.token, comprador, split, postbackUrl e metadata.
1. Autorize o valor
/api/v1/paymentintentsAcrescente captureMethod: "Manual" na raiz do corpo. A grafia é exata: capture_method em snake_case é ignorado e a cobrança sai com captura automática, ou seja, cobrada na hora.
{
"amount": 10990,
"currency": "BRL",
"captureMethod": "Manual",
"paymentMethods": [{
"type": "CreditCard",
"amount": 10990,
"card": {
"number": "5555555555554444",
"expMonth": 12,
"expYear": 2030,
"cvc": "123",
"holderName": "MARIA SOUZA"
}
}],
"paymentMethodOptions": { "creditCard": { "installments": 1 } },
"customer": {
"name": "Maria Souza",
"email": "maria@example.com",
"document": "12345678909",
"address": { "zipCode": "01310100", "country": "BR" }
},
"postbackUrl": "https://loja.example.com/webhooks/dm",
"metadata": { "orderId": "pedido-1001" }
}curl -X POST "$DM_API_BASE/api/v1/paymentintents" \
-H "Authorization: $DM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-1001-tentativa-1" \
--data-binary @pre-autorizacao.jsonCom o cartão aprovado, a resposta é 201 com status: "RequiresCapture", e o webhook payment_intent.requires_capture é enviado. Guarde o id e o captureBefore.
{
"id": "3b8f6c2a-91d4-4e7b-a0c5-6d2e8f1a4b97",
"status": "RequiresCapture",
"captureMethod": "Manual",
"amount": 10990,
"amountCapturable": 10990,
"amountCaptured": 0,
"amountReleased": 0,
"authorizedAt": "2026-11-04T18:00:00Z",
"captureBefore": "2026-11-11T18:00:00Z",
"capture": null,
"lastCaptureError": null,
"paymentMethods": [{
"type": "CreditCard",
"status": "Authorized",
"amountCapturable": 10990,
"amountCaptured": 0
}]
}Os outros desfechos do create são os da cobrança com cartão:
status na resposta 201 | O que aconteceu | O que fazer |
|---|---|---|
RequiresCapture | Autorizado; o valor está reservado. | Siga para a captura ou o cancelamento. |
Failed | O banco recusou, ou o cartão não aceita pré-autorização (lastPaymentError.code: "CAPTURE_METHOD_NOT_SUPPORTED"). | Mostre a recusa ao comprador. Nenhum webhook é enviado para essa recusa: trate a resposta. |
Processing | O resultado da autorização ainda não chegou. | Aguarde payment_intent.requires_capture ou consulte a cobrança. Não capture ainda: a captura responde 409 payment_intent_not_capturable. |
2a. Capture o valor
/api/v1/paymentintents/{id}/captureQuando decidir cobrar, capture. O corpo é opcional: sem amount, a captura é do valor autorizado.
curl -X POST "$DM_API_BASE/api/v1/paymentintents/3b8f6c2a-91d4-4e7b-a0c5-6d2e8f1a4b97/capture" \
-H "Authorization: $DM_API_KEY" \
-H "Idempotency-Key: captura-pedido-1001-tentativa-1"A resposta traz a cobrança inteira:
| HTTP | Significado | Estado da cobrança |
|---|---|---|
200 | Captura confirmada. O comprador foi cobrado e payment_intent.succeeded é enviado. | Succeeded, amountCaptured igual ao autorizado, capture.status: "Succeeded". |
202 | O resultado ainda está sendo confirmado com o banco. | Segue RequiresCapture, com capture.status: "Processing" e lastCaptureError.code: "capture_ambiguous". |
422 capture_declined | O banco recusou a captura. payment_intent.capture_failed é enviado. | Segue RequiresCapture, com o motivo em lastCaptureError. |
Depois de um 202, não capture de novo com outra chave
O 202 não é falha: a captura pode ter sido feita. Consulte a cobrança depois do Retry-After (5 segundos) ou aguarde o webhook. Uma nova tentativa com outra Idempotency-Key antes do resultado responde 409 capture_already_in_progress; repetir com a mesma chave é seguro.
A captura parcial não está disponível. Enviar um amount menor que o autorizado responde 422 capture_not_supported_by_provider; maior que o autorizado, 422 capture_amount_exceeds_capturable. Se o valor final ficou menor, cancele a reserva e crie outra cobrança com o valor certo.
2b. Ou cancele e libere a reserva
/api/v1/paymentintents/{id}/cancelSe o pedido não vai seguir, cancele. Nada é cobrado e o valor volta ao limite do comprador. O motivo é opcional; o padrão é requested_by_customer.
curl -X POST "$DM_API_BASE/api/v1/paymentintents/3b8f6c2a-91d4-4e7b-a0c5-6d2e8f1a4b97/cancel" \
-H "Authorization: $DM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: cancelamento-pedido-1001" \
-d '{ "cancellationReason": "requested_by_customer" }'cancellationReason | Quando usar |
|---|---|
requested_by_customer | O comprador desistiu (padrão). |
duplicate | A cobrança foi criada em duplicidade. |
fraudulent | Sua análise apontou fraude. |
abandoned | O pedido foi abandonado ou não pode ser atendido. |
Escreva o motivo em minúsculas. Valor fora da lista responde 400 invalid_cancellation_reason. O motivo expired existe só nas respostas: é a Accelerazione que o usa quando o prazo vence.
Com 200, a cobrança vira Canceled, amountReleased mostra o valor liberado e payment_intent.canceled é enviado. Um 202 tem o mesmo tratamento da captura, com capture.status: "VoidProcessing". Depois da captura não existe cancelamento: a resposta é 409 already_captured_use_refund e o caminho é o estorno.
O prazo da reserva
A reserva vale até captureBefore, 7 dias depois de authorizedAt. Agende a decisão dentro desse prazo e use o campo da resposta, não um cálculo próprio.
Sem captura nem cancelamento, a Accelerazione libera a reserva depois de captureBefore: a cobrança vira Canceled com cancellationReason: "expired" e payment_intent.canceled é enviado. A liberação roda em ciclos de alguns minutos, então a mudança de status não é instantânea. Uma captura feita nesse intervalo pode responder 422 authorization_expired; a cobrança então vira Canceled com motivo expired.
Acompanhe pelos webhooks
Os eventos chegam na postbackUrl da cobrança, com o mesmo envelope e a mesma assinatura dos demais.
eventType | Quando é enviado | data.status |
|---|---|---|
payment_intent.requires_capture | A autorização foi aprovada, no create ou depois de um Processing. | RequiresCapture |
payment_intent.succeeded | A captura foi confirmada. | Succeeded |
payment_intent.capture_failed | O banco recusou a captura. A cobrança continua capturável. | RequiresCapture |
payment_intent.canceled | Você cancelou, ou o prazo venceu (cancellationReason: "expired"). | Canceled |
O 202 da captura e do cancelamento não gera webhook: o evento chega quando o resultado sai. O conteúdo de cada evento está em Eventos.
Os campos de valor
Todos em centavos.
| Campo | Em RequiresCapture | Depois da captura | Depois do cancelamento ou da expiração |
|---|---|---|---|
amountCapturable | valor autorizado | 0 | 0 |
amountCaptured | 0 | valor cobrado | 0 |
amountReleased | 0 | 0 | valor liberado |
paymentMethods[].status | Authorized | Captured | Voided |
Toda cobrança passa a ter captureMethod, e uma cobrança Automatic paga mostra amountCaptured igual a amount. Em cobranças Automatic, paymentMethods[].status vem null.
Repita com segurança
A captura e o cancelamento aceitam Idempotency-Key (1 a 200 caracteres), retida por 24 horas.
- Use uma chave por tentativa de decisão, por exemplo
captura-pedido-1001-tentativa-1. Repita com a mesma chave depois de timeout,503ou queda de conexão. - Sem o cabeçalho, a chave é a própria cobrança. A primeira resposta, inclusive um erro, se repete por 24 horas. Se a primeira captura foi recusada e você quer tentar de novo, envie uma chave nova.
- A mesma chave com outro corpo (outro
amountou outro motivo) responde409 idempotency_payload_mismatch.
Depois da captura: estorno
Uma pré-autorização capturada é uma cobrança Succeeded comum: o estorno segue o mesmo fluxo e é integral, sobre amountCaptured.
Erros
O código vem em type, no formato Problem Details. Catálogo completo em códigos de erro.
| HTTP e código | Causa | O que fazer |
|---|---|---|
403 capture_not_enabled_for_merchant | Sua conta não está habilitada para pré-autorização. | Peça a habilitação à equipe de integração, ou cobre com captura automática. |
422 capture_method_* | A cobrança não cumpre os requisitos: mais de um meio, débito, parcelas ou deferConfirmation. | Ajuste o pedido conforme Antes de começar. |
422 THREE_DS_DEFERRED_CAPTURE_NOT_SUPPORTED | A cobrança tem 3DS ou a política exige 3DS para o cartão. | Cobre com captura automática. |
404 payment_intent_not_found | O id não existe ou não é da sua conta. | Confira o id e a chave de API. |
409 payment_intent_not_capturable | A cobrança não é Manual ou não está RequiresCapture (ainda Processing, já capturada ou cancelada). | Consulte a cobrança e siga o status. |
409 capture_already_in_progress | Há uma captura ou um cancelamento em andamento. | Aguarde Retry-After e consulte a cobrança. |
409 already_captured_use_refund | Você tentou cancelar uma cobrança já capturada. | Faça o estorno. |
409 cannot_cancel_processing | A autorização ainda está Processing. | Aguarde payment_intent.requires_capture e cancele depois. |
422 capture_declined | O banco recusou a captura. | Tente de novo com uma nova chave até captureBefore, ou cancele. |
422 authorization_expired | A reserva venceu antes da captura. | A cobrança vira Canceled: crie outra cobrança se ainda precisar cobrar. |
503 provider_unavailable, 503 card_transaction_pending | Instabilidade temporária, ou a autorização acabou de ser criada. | Repita com a mesma chave depois de Retry-After. |
O que esta página não cobre
- Captura parcial e várias capturas da mesma reserva: não disponíveis.
- Pré-autorização com 3DS, parcelas ou débito: não disponíveis. Use a cobrança com cartão com captura automática.
- Referência das rotas: Capturar e Cancelar.