Skip to main content
No cartão você não recebe o número do cartão em momento nenhum. A API devolve uma URL de checkout hospedado, o cliente paga lá, e você recebe o resultado por webhook e por consulta. Isso mantém dado de cartão fora do seu servidor, que é exatamente onde ele deve ficar.
Cartão não funciona em sandbox. Com chave ps_test_ a resposta é erro. Para testar, use produção com um valor baixo.

Criando a cobrança

Resposta 201
Redirecione o cliente para checkoutUrl. A sessão vale 30 minutos.
Cartão é o único recurso identificado por orderCode em vez de paymentId. É esse código que você usa para consultar e é ele que volta no webhook.

Para onde o cliente volta

Cair na successUrl não significa pagamento aprovado. É só o navegador voltando, e qualquer pessoa consegue abrir essa URL na mão. Libere o produto pelo webhook card_payment.paid ou pela consulta, nunca pelo redirecionamento.

Consultando

Status possíveis: pending, paid, expired, refunded e failed. Para listar, use GET /v1/card-payments com limit, offset e status.

Cartão tem prazo de liberação

Diferente do PIX, o valor do cartão entra como a liberar antes de virar saldo sacável. Em GET /v1/wallet esse montante aparece em pendingRelease, e ele não entra no withdrawable.
Vale considerar isso no seu fluxo de caixa: vendeu no cartão hoje não quer dizer que dá pra sacar hoje. O detalhe de cada campo está em Carteira.

Diferenças no webhook

O evento é card_payment.paid e a forma muda um pouco em relação ao PIX:
Repare em duas coisas: o identificador é orderCode e não paymentId, e o valor vem em amount (reais, decimal) e não em amountCents. Se o seu handler for genérico, trate os dois formatos.
Detalhes completos em Webhook de cartão.