Docs
Cartões

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:

  1. 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 status: "RequiresCapture".
  2. O valor fica reservado no limite do comprador até captureBefore, 7 dias depois da autorização. Nada foi cobrado.
  3. Caminho A: POST /api/v1/paymentintents/{id}/capture cobra o valor. A cobrança vira Succeeded e chega payment_intent.succeeded.
  4. Caminho B: POST /api/v1/paymentintents/{id}/cancel libera a reserva sem cobrar. A cobrança vira Canceled e chega payment_intent.canceled.
  5. Sem decisão até captureBefore, a Accelerazione libera a reserva sozinha. A cobrança vira Canceled com cancellationReason: "expired".
Estados da cobrança pré-autorizada: Processing leva a RequiresCapture ou Failed; RequiresCapture leva a Succeeded pela captura ou a Canceled pelo cancelamento ou pela expiração; Succeeded pode virar Refund pelo estorno

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.installments igual a 1 ou ausente.
  • Sem 3DS: não envie threeDs.sessionToken nem threeDSecure: "required". Se a política de aceitação exigir autenticação para aquele cartão, a cobrança é recusada com THREE_DS_DEFERRED_CAPTURE_NOT_SUPPORTED; nesse caso, cobre com captura automática.
  • Confirmação imediata: deferConfirmation ausente ou false.
  • 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

POST/api/v1/paymentintents

Acrescente 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.

pre-autorizacao.json
{
  "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" }
}
Terminal
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.json

Com o cartão aprovado, a resposta é 201 com status: "RequiresCapture", e o webhook payment_intent.requires_capture é enviado. Guarde o id e o captureBefore.

Resposta 201 (trecho)
{
  "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 201O que aconteceuO que fazer
RequiresCaptureAutorizado; o valor está reservado.Siga para a captura ou o cancelamento.
FailedO 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.
ProcessingO 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

POST/api/v1/paymentintents/{id}/capture

Quando decidir cobrar, capture. O corpo é opcional: sem amount, a captura é do valor autorizado.

Terminal
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:

HTTPSignificadoEstado da cobrança
200Captura confirmada. O comprador foi cobrado e payment_intent.succeeded é enviado.Succeeded, amountCaptured igual ao autorizado, capture.status: "Succeeded".
202O resultado ainda está sendo confirmado com o banco.Segue RequiresCapture, com capture.status: "Processing" e lastCaptureError.code: "capture_ambiguous".
422 capture_declinedO 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

POST/api/v1/paymentintents/{id}/cancel

Se 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.

Terminal
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" }'
cancellationReasonQuando usar
requested_by_customerO comprador desistiu (padrão).
duplicateA cobrança foi criada em duplicidade.
fraudulentSua análise apontou fraude.
abandonedO 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.

eventTypeQuando é enviadodata.status
payment_intent.requires_captureA autorização foi aprovada, no create ou depois de um Processing.RequiresCapture
payment_intent.succeededA captura foi confirmada.Succeeded
payment_intent.capture_failedO banco recusou a captura. A cobrança continua capturável.RequiresCapture
payment_intent.canceledVocê 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.

CampoEm RequiresCaptureDepois da capturaDepois do cancelamento ou da expiração
amountCapturablevalor autorizado00
amountCaptured0valor cobrado0
amountReleased00valor liberado
paymentMethods[].statusAuthorizedCapturedVoided

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, 503 ou 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 amount ou outro motivo) responde 409 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ódigoCausaO que fazer
403 capture_not_enabled_for_merchantSua 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_SUPPORTEDA cobrança tem 3DS ou a política exige 3DS para o cartão.Cobre com captura automática.
404 payment_intent_not_foundO id não existe ou não é da sua conta.Confira o id e a chave de API.
409 payment_intent_not_capturableA 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_progressHá uma captura ou um cancelamento em andamento.Aguarde Retry-After e consulte a cobrança.
409 already_captured_use_refundVocê tentou cancelar uma cobrança já capturada.Faça o estorno.
409 cannot_cancel_processingA autorização ainda está Processing.Aguarde payment_intent.requires_capture e cancele depois.
422 capture_declinedO banco recusou a captura.Tente de novo com uma nova chave até captureBefore, ou cancele.
422 authorization_expiredA reserva venceu antes da captura.A cobrança vira Canceled: crie outra cobrança se ainda precisar cobrar.
503 provider_unavailable, 503 card_transaction_pendingInstabilidade 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.

Nesta página