Skip to main content
Uma cobrança (charge) é um pagamento avulso — não precisa estar ligado a um produto. Você envia os itens e a Gravity Play calcula o total, monta o checkout e devolve a checkoutUrl.

Criando uma cobrança

Resposta

Guarde o postbackSecret. Ele é retornado apenas na criação e serve para validar a assinatura dos webhooks (postbackUrl) desta cobrança. Veja Webhooks.

Os itens

Cada item tem name, quantity e unitAmountInCents. O total é a soma de quantity × unitAmountInCents de todos os itens, e é renderizado no checkout como uma linha de pedido:
Se preferir, você pode omitir items e enviar apenas amountInCents (cobrança sem detalhamento).

Campos da requisição

Vencimento do boleto

Quando o cliente paga a cobrança com boleto, o prazo de vencimento é resolvido nesta ordem:
  1. O campo dueInDays enviado na chamada que gera o boleto (só existe para quem monta o próprio checkout).
  2. O campo boletoDueInDays da cobrança, enviado no POST /v1/charges.
  3. O prazo configurado no produto (não se aplica à cobrança avulsa, que não tem produto).
  4. O padrão da loja, em Configurações da loja → Vencimento padrão dos boletos.
  5. 1 dia, quando nada foi configurado.
Use boletoDueInDays se o seu cliente paga no checkout hospedado. O checkout roda no navegador do comprador e não conhece o prazo que o seu sistema prometeu — gravá-lo na cobrança é o que garante o vencimento certo. Uma vez enviado, mudar a configuração da loja ou do produto no painel não reescreve o que você pediu. O valor aceito vai de 1 a 60 dias.
Boletos já emitidos não mudam: o vencimento é impresso no documento. Uma alteração de configuração vale da próxima emissão em diante.

Pagamento transparente

Com o pagamento transparente, o comprador paga sem sair do seu site: você recebe o PIX (copia-e-cola e QR Code), o boleto (linha digitável e PDF) ou o resultado do cartão direto na resposta da API, em vez de redirecionar para a checkoutUrl. O gateway de cada método é decidido pela Gravity Play, pela mesma regra do checkout hospedado. Taxa da plataforma, split, parcelamento, e-mails e webhooks são exatamente os mesmos.

1. Consulte o que a loja aceita

card.input diz como o cartão deve chegar: A tabela de parcelas só vem quando você manda amountInCents (sem ele, installments é null). Esta rota também serve para validar a chave ao salvá-la no seu sistema: 200 é chave boa, 401 é chave inválida e 403 é chave sem o escopo charges:read.

2. Crie a cobrança e o pagamento numa chamada

Mande o campo payment no POST /v1/charges:
A resposta é a cobrança de sempre (com o postbackSecret) e o pagamento:
  • pix.qrCodeBase64 é um PNG em base64 (sem o prefixo data:), gerado a partir do copia-e-cola: renderize com <img src="data:image/png;base64,...">. Ele sai igual em qualquer gateway.
  • payment.id é o mesmo data.id dos webhooks payment.*.
  • totalInCents inclui o juro do parcelamento quando o comprador paga.
  • status do pagamento: pending, paid ou failed.
O corpo inteiro é validado antes de criar qualquer coisa. Se faltar um dado, inclusive um que só o gateway da loja exige, a resposta é 400 com o param e nenhuma cobrança nasce. Criada a cobrança, a resposta é sempre 201: se o pagamento falhar (cartão recusado, método indisponível, gateway fora), ela vem com paymentError no lugar de payment, e a cobrança segue pending para uma nova tentativa.
Repetir a chamada com o mesmo Idempotency-Key devolve a cobrança e o último pagamento dela, sem postbackSecret e sem criar outro pagamento.

3. Nova tentativa numa cobrança que já existe

O corpo é o mesmo do campo payment. A resposta é 201 com o pagamento novo, ou 200 quando já existe um PIX (com mais de 5 minutos de validade) ou um boleto (dentro do vencimento) pendente do mesmo método nesta cobrança: ele é devolvido de novo, e a cobrança nunca fica com dois PIX ou dois boletos pendentes. Outro método cria um pagamento novo.

Cartão

Na loja com cartão Asaas (card.input = raw), mande o cartão aberto, o IP do comprador e o CEP e número do endereço:
Aprovado na hora, o pagamento volta paid, a cobrança vira paid e o postbackUrl recebe payment.paid. Na loja Pagar.me ou Efí, gere o token no navegador e mande card.token (no Pagar.me, threedsTransactionId opcional para o 3DS). Mandar o formato errado para o gateway (cartão aberto no Pagar.me ou na Efí, token no Asaas, qualquer cartão no Stripe) dá 422 card_input_not_supported.
buyer.ip é o IP do comprador, que o seu site recebe. Nunca mande o IP do seu servidor: o gateway usa esse dado no antifraude. Dados de cartão nunca são gravados nem aparecem em log, banco ou mensagem de erro na Gravity Play, e o seu sistema também não deve guardá-los.

O que cada gateway exige

O documento é CPF (11 dígitos) ou CNPJ (14 dígitos), com ou sem máscara, e precisa ter o dígito verificador certo. O telefone precisa do DDD. O nome vai ao gateway com até 64 caracteres.

Erros

A mensagem de recusa do gateway só chega quando ele a marca como segura para o comprador; nos outros casos, a mensagem é genérica.

Consultando uma cobrança

O campo status evolui assim: Você não precisa ficar consultando: assim que o pagamento confirma, enviamos um webhook. Para listar todas as vendas, use GET /v1/payments — veja a aba Referência da API.