Gates2b

Criar cobrança

Cria uma cobrança avulsa em PIX, boleto ou cartão e devolve o link de checkout para o pagador.

POST
/charge

Authorization

apiKey
headerAuthorizationBearer <token>

Chave de API gerada no painel: Authorization: Bearer <chave>.

Request Body

application/json
  1. body
grossAmount*string

Valor da cobrança na moeda de currency, string com ponto e duas casas decimais: "49.90". amount é aceito como nome alternativo. Com passthroughFees: true, é o valor que você quer receber e o pagador paga mais.

Padrão (regex)^\d{1,20}\.\d{2}$
currency*string

Moeda da cobrança.

Valores aceitos"BRL""USD""EUR"
paymentMethod?string

Meio de pagamento. Define o formato da resposta e restringe o checkout a esse meio. Omitido, o checkout mostra todos os meios habilitados na conta para a moeda.

  • PIX: a resposta já traz o QR Code. Em USD ou EUR, o câmbio é travado na criação e o QR cobra o valor convertido em reais.
  • BANK_SLIP: o boleto é emitido na hora, com um QR Code PIX para o mesmo valor. Exige customerMeta com nome, documento e endereço.
  • CREDIT_CARD: só cria a cobrança. O pagador informa o cartão no checkout; dados de cartão nunca passam por esta API.
  • CRYPTO: cria a cobrança em cripto. Veja o guia de cripto.
Valores aceitos"PIX""BANK_SLIP""CREDIT_CARD""CRYPTO"
externalReference?string

Identificador do pedido no seu sistema. Volta nos webhooks e nas consultas.

Tamanholength <= 255
description?string

Descrição da cobrança.

Tamanholength <= 2000
expiresAt?string

Prazo para pagar, em ISO 8601. Depois dele a cobrança PENDING passa a EXPIRED.

Formatodate-time
webhookUrl?string

URL gravada na cobrança. Hoje nenhuma notificação é enviada para ela: para saber que a cobrança foi paga, assine charge.paid numa inscrição de webhook. Se enviar, precisa ser http ou https com domínio público; IP literal, endereço privado e domínio curinga são recusados com 400.

Formatouri
Tamanholength <= 2048
attemptIdempotencyKey?string

Chave de idempotência da tentativa de pagamento, única por conta. Uma chave já usada nos últimos 30 dias é recusada com 409, sem criar nova tentativa. Gere um valor novo por cobrança.

Tamanholength <= 128
passthroughFees?boolean

true repassa as tarifas ao pagador: grossAmount passa a ser o valor que você recebe e o total cobrado sobe para cobrir as tarifas. false (padrão): o pagador paga grossAmount e as tarifas saem do seu valor. Com true, paymentMethod é obrigatório e não pode ser CRYPTO.

Padrãofalse
customerMeta?

Dados do pagador. Opcional, exceto com paymentMethod: "BANK_SLIP", que exige name, document e address completo. Nas respostas, documento, e-mail e telefone voltam mascarados.

gatewayOptions?

Opções do checkout e da tentativa de pagamento.

split?array<>

Divide o valor líquido (netAmount) entre outras contas. Até 20 itens. O restante fica com você.

Itensitems <= 20

Response Body

Cobrança criada. O formato depende de paymentMethod: com PIX ou BANK_SLIP (ou CRYPTO) a resposta é a tentativa de pagamento (ChargeAttempt, com chargeId); sem paymentMethod ou com CREDIT_CARD, é a cobrança (Charge). As duas trazem checkoutUrl.

application/json
  1. response

Tentativa de pagamento, criada na hora com PIX ou BANK_SLIP (ou CRYPTO).

id?string

Id da tentativa.

Formatouuid
chargeId?string

Id da cobrança. Use em consultas e no reembolso.

status?string

Status da tentativa: CREATED, PROCESSING (aguardando o pagamento), CONFIRMED, FAILED ou EXPIRED. Para saber se foi pago, use o status da cobrança.

Valores aceitos"CREATED""PROCESSING""CONFIRMED""FAILED""EXPIRED"
paymentMethod?string

Meio de pagamento da tentativa.

Valores aceitos"PIX""BANK_SLIP""CRYPTO"
checkoutMeta?

Instruções de pagamento. Os campos presentes dependem do meio.

checkoutUrl?string

Link do checkout. Envie ao pagador.

Formatouri
createdAt?string

Criação, em UTC.

Formatodate-time
updatedAt?string

Última alteração, em UTC.

Formatodate-time
curl -X POST 'https://api.gates2b.com/charge' \  -H 'Content-Type: application/json' \  -d '{  "grossAmount": "49.90",  "currency": "BRL",  "paymentMethod": "PIX",  "externalReference": "pedido-0001",  "description": "Assinatura mensal",  "expiresAt": "2026-11-30T23:59:59Z"}'
Example Response
{  "id": "0192f4c6-7d1e-7a3b-9c2d-4e5f6a7b8c9d",  "chargeId": "01JC8Z3R5W7Y9A1C3E5G7J9K2M",  "status": "PROCESSING",  "paymentMethod": "PIX",  "checkoutMeta": {    "url": "https://pay.gates2b.com/01JC8Z3R5W7Y9A1C3E5G7J9K2M",    "paymentMethod": "PIX",    "emv": "00020101021226810014br.gov.bcb.pix2559qr.example.com/v2/cobv/9d36b84f...6304A1B2",    "qr_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."  },  "checkoutUrl": "https://pay.gates2b.com/01JC8Z3R5W7Y9A1C3E5G7J9K2M",  "createdAt": "2026-10-22T14:00:00.000Z",  "updatedAt": "2026-10-22T14:00:00.000Z"}

O formato da resposta depende de paymentMethod

Com PIX ou BANK_SLIP (ou CRYPTO), a resposta é a tentativa de pagamento: o id é da tentativa e o id da cobrança vem em chargeId. Sem paymentMethod ou com CREDIT_CARD, a resposta é a própria cobrança e o id é o da cobrança. Guarde o id da cobrança: é ele que o reembolso e as consultas pedem.

Como funciona

Uma cobrança guarda o que você vende: valor, moeda, externalReference, prazo e status. O pagamento em si acontece numa tentativa de pagamento, ligada à cobrança. Uma cobrança pode ter várias tentativas (um PIX que venceu, depois um cartão no checkout), mas só é paga uma vez.

Cobrança

  • id = chargeId
  • status, valor, externalReference
tem

Tentativa na criação

  • paymentMethod PIX ou BANK_SLIP
  • QR Code ou boleto na resposta

Tentativa no checkout

  • o pagador escolhe o meio
  • em checkoutUrl

Nova tentativa

  • depois de uma tentativa recusada
  • a cobrança segue aberta
Uma cobrança e suas tentativas de pagamento: a cobrança tem o status que importa; cada tentativa é um jeito de pagá-la.

Por isso o formato da resposta muda. Com PIX ou BANK_SLIP, a API cria a cobrança e a tentativa na mesma chamada e devolve a tentativa, que é onde estão o QR Code e o boleto. Sem paymentMethod, ou com CREDIT_CARD, nenhuma tentativa é criada agora: a resposta é a cobrança, e a tentativa nasce quando o pagador escolhe o meio e paga em checkoutUrl. Dados de cartão nunca passam por esta API.

Cobrança PIX: a resposta já traz o QR Code; o pagamento é confirmado depois, pelo webhook charge.paid.

Status da cobrança

PENDING

aguardando pagamento

prazo vence sem pagamento
EXPIRED
pagamento confirmado
PAID

dispara charge.paid

valor retido pela plataforma
RETAINED
reembolso do valor total
REFUNDED

todo o valor devolvido

Ciclo de vida da cobrança: PENDING até o pagamento, PAID quando pago e REFUNDED só depois do reembolso total.
  • Libere o pedido em PAID. Esse é o único status de cobrança paga.
  • Cada reembolso, parcial ou total, dispara charge.refunded. O parcial mantém a cobrança em PAID e aumenta refundedAmount; ela só vai a REFUNDED quando o total reembolsado chega a grossAmount.
  • Uma tentativa recusada (cartão negado, por exemplo) não muda a cobrança: ela continua PENDING e aceita nova tentativa até o prazo.
  • Nas consultas, uma cobrança PENDING com expiresAt vencido já aparece como EXPIRED.
  • CANCELED e FAILED também existem. Trate os dois como cobrança encerrada sem pagamento.

Em cripto há mais um status, PARTIAL: o pagador transferiu menos que o cotado. A cobrança continua aberta e vira PAID quando o restante chega. Detalhes em Cripto na cobrança.

Regras

  • A conta precisa ter a verificação cadastral concluída. Antes disso, a criação responde 403 com code KYC_PENDING.
  • grossAmount é string com ponto e duas casas decimais: "49.90". Não envie vírgula nem notação científica.
  • O pagamento é confirmado pelo evento charge.paid, entregue às suas inscrições de webhook. O campo webhookUrl é gravado na cobrança, mas hoje não recebe notificação. Veja Webhooks.
  • Use externalReference para ligar a cobrança ao pedido no seu sistema. Ela volta no charge.paid.
  • attemptIdempotencyKey impede tentativa duplicada: a mesma chave usada de novo na conta, em até 30 dias, responde 409 e nada novo é criado. Depois de um timeout, busque a cobrança pelo externalReference antes de criar outra com chave nova.

Boleto

  • customerMeta.name, customerMeta.document e o customerMeta.address completo (zipcode, street, number, neighborhood, city, state) são obrigatórios. Faltando algum, a resposta é 400 com todos os campos ausentes na mensagem, e a cobrança não é criada.
  • O boleto é emitido na hora. A resposta traz o boleto em checkoutMeta.bankSlip e um QR Code PIX que paga o mesmo valor em checkoutMeta.pix.
  • bankSlip.value e bankSlip.fee são inteiros em centavos de real (15000 = R$ 150,00), enquanto grossAmount é string em unidades da moeda. Em cobrança USD ou EUR, o boleto cobra o valor convertido em reais.
  • A API não devolve imagem do boleto. Gere o código de barras a partir de barcode (padrão Interleaved 2 of 5) e mostre digitableLine para copiar.
  • Se o boleto não estiver habilitado na conta, a resposta é 400 com BANK_SLIP is not enabled for this account.

Repasse de tarifas

Com passthroughFees: true, grossAmount é o valor que você quer receber; o pagador paga esse valor mais as tarifas. A opção exige paymentMethod definido e não vale para CRYPTO. Sem ela, o pagador paga grossAmount e as tarifas saem do seu valor (netAmount).

Split

  • O split divide o netAmount, não o grossAmount. PERCENT é um percentual dele; FIXED, um valor fixo em string com duas casas.
  • Cada parte vai para a conta dona do email. Se não houver conta com esse e-mail, a parte fica com você.
  • splitSettlement mostra a divisão efetiva, em centavos, depois que a cobrança é paga.

Cripto

Com paymentMethod: "CRYPTO", a quantidade de itens em gatewayOptions.cryptoTickers muda o comportamento:

  • Um ticker trava a moeda. A resposta já traz endereço, valor e QR Code em checkoutMeta.crypto, e a reserva de 20 minutos começa a contar na criação.
  • Dois ou mais tickers, ou o campo omitido, deixam a escolha para o pagador no checkout. A resposta vem sem checkoutMeta.crypto e sem qr_image.

Em CRYPTO, checkoutMeta.redirectUrl é uma página de pagamento alternativa para a tentativa, não a URL de retorno que você enviou em gatewayOptions.redirectUrl. Mande o pagador para checkoutUrl.

Tickers aceitos, reserva, status e exibição do valor: Cripto na cobrança.

Nesta página