Skip to main content
Use quando o pagador paga numa página de checkout, sem você tokenizar cartão no seu servidor. O fluxo parte de um link de pagamento: ele guarda o que você vende e, a cada visita, vira uma sessão de checkout com um clientSecret, a única credencial que o navegador usa para ler e pagar aquela sessão.
Os exemplos usam o sandbox (https://api.upag.dev/v1) com sk_test_… e pk_test_…. Em produção use https://api.upag.io/v1 com sk_live_… e pk_live_…. Os SDKs escolhem o host pelo prefixo da chave.
No servidor, com a chave secreta. Os preços vêm de Produtos e Preços (valores em centavos).
O url do link tem a forma …/buy/{code}. O code (o último trecho) é o que o navegador usa para abrir a sessão:
Referência: Criar link de pagamento. Para vender com teste grátis, veja Teste grátis.

2. Abrir a sessão no navegador

Com o upag-js e só a chave publicável. Um link inativo responde 410 (PAYMENT_LINK_INACTIVE).
upag-js
Guarde id e clientSecret (só vem nesta resposta). Se você só quer levar o pagador à página hospedada, await upag.checkout.redirectToCheckout(code) abre a sessão e redireciona para url. A resposta já traz o que a página precisa: itens, amount em centavos, e as opções de parcelamento por método em paymentMethods. Para recarregar depois: upag.checkout.retrieve(id, clientSecret). Referência: Iniciar sessão e Obter sessão (pagador).

3. Confirmar o pagamento

Pix

upag-js
A sessão fica open até o Pix ser pago. Para atualizar a tela, consulte upag.checkout.retrieve(id, clientSecret) de tempos em tempos até status === 'complete' (o servidor também recebe os webhooks do passo 4).

Cartão

Tokenize o cartão no navegador (o número nunca passa pelo seu servidor) e confirme com o id:
upag-js
O cartão responde na hora: aprovado, a sessão fica complete; recusado, continua open e dá para tentar de novo (a mesma fatura é paga outra vez, e o pagador pode trocar para Pix). Com 3D Secure habilitado (session.account.threeDSecureEnabled), abra antes a sessão 3DS do checkout e envie threeDSecureSession no charge. Veja Cartão com 3DS. Cupom: se o link tem couponEnabled, use upag.checkout.applyCoupon(id, clientSecret, { code }) antes de confirmar (Aplicar cupom). Referência: Confirmar sessão.

4. Receber os webhooks

O redirect sozinho não prova que o pagamento foi feito: confirme no servidor pelos webhooks. Trate checkout-session.completed (a sessão foi paga) e, se quiser o detalhe do pagamento, charge.paid e invoice.paid. Numa compra com itens recorrentes, subscription.active também chega.
Node.js SDK
Valide a assinatura e deduplique pelo id da entrega: Segurança. Payloads: checkout, cobrança e fatura.

Pagar do seu servidor (sem página)

Se você mesmo coleta os dados do pagador, pule o link: crie a sessão com a chave secreta (Criar sessão) e pague com Confirmar, passando o UUID de um cliente ou os dados dele. A sessão criada assim não tem clientSecret.
Node.js SDK