chk_) é um template de cobrança reutilizável. Você define uma vez os
itens, o preço, os métodos e o branding, e divulga a URL quantas vezes quiser — cada acesso de
comprador materializa uma Session independente. É o formato para link na bio, página de captura
ou qualquer divulgação em massa.
Para cobrar uma pessoa uma vez, sem template, o caminho é a
venda rápida.
Todas as rotas exigem o header
x-api-key. Veja Autenticação. Os exemplos
usam a base URL de sandbox https://api.sandbox.z2pay.com/v1, e a página hospedada de sandbox é
https://pay.sandbox.z2pay.com.Endpoints
Cada endpoint tem sua própria página, com os campos aceitos, exemplos e o playground para testar.Do Link à Session
O Link é o molde; a Session (cs_) é a compra. Quando um comprador abre a URL — ou quando você
cria uma venda rápida — a Z2Pay materializa uma Session com o valor
congelado e um estado que avança conforme ele interage.
O snapshot é imutável. Itens, preço, splits, branding e métodos são copiados para a Session no
momento em que ela nasce. Editar o Link depois não alcança Sessions já criadas: o comprador paga
exatamente o que viu quando abriu a página.
Em Session que veio de um Link, linkId aponta para o template de origem; em Session de venda
rápida, linkId é null. Nos dois casos, transactionId liga a Session ao pagamento — e é
preenchido quando ela entra em paying.
Estados da Session
O caminho feliz écreated → opened → filling → paying → paid.
Expirar não alcança quem está pagando. Sessions em
paying ou partially_paid nunca são
expiradas pelo processo automático — quem está no meio de um pagamento não perde a compra por
tempo. Os demais estados não-terminais expiram ao atingir expiresAt.partially_paid e paying → opened são exclusivos do combinado. Em pagamento por um método
só, a Session vai direto de paying para paid ou failed. A volta para opened acontece
quando os cartões falham mas o Pix ou o boleto seguem pendentes, devolvendo o comprador à página
para tentar outra composição.Duas requisições não confirmam a mesma Session. Toda transição é protegida por controle de
concorrência: se duas chegarem juntas, só uma vence — a outra recebe
session_already_processing ou invalid_status_transition. O contador que faz esse controle é
interno e não sai na resposta.Assinaturas via Checkout
Um Link commode: "subscription" vende uma assinatura recorrente: o comprador paga a primeira
cobrança na página hospedada e a Z2Pay ativa a assinatura sozinha. O modelo de planos, ciclos e
faturas está em Assinaturas.
Cinco regras que nenhum schema expressa:
modee o objetosubscriptionandam juntos — enviar um sem o outro é recusado.- Pagamento combinado não vale aqui —
paymentMethods.combined.enabledé recusado em Link de assinatura. Pelo menos um método precisa estar habilitado. - Só por Link — a venda rápida recusa
mode: "subscription". Recorrência não nasce de Session avulsa. - Adesão e trial se excluem — item com
chargeType: "activation"esubscription.trialDays > 0no mesmo Link é recusado. São opostos: a adesão cobra a mais no começo, o trial cobra a menos. - Com trial, só cartão — e para validá-lo o checkout faz uma cobrança de R$ 1,23
(
123centavos) estornada automaticamente. A assinatura nasce em trial, sem cobrança real até o fim do período.
subscriptionId (sub_).
Espere o
subscriptionId antes de concluir que deu errado. A ativação leva alguns segundos, e
se falhar o worker retenta sozinho a cada 60 segundos, até cinco vezes — cinco minutos no pior
caso. Consulte a Session de novo em vez de tratar o campo nulo como erro.Passado esse prazo com subscriptionId ainda nulo, o motivo da falha fica em
session.metadata.subscription_activation_error. A recuperação é manual: fale com o suporte com
o cs_ em mãos.metadata. Na ativação, a Z2Pay grava três chaves
reservadas no metadata da assinatura — e elas saem em todos os eventos subscription.*,
inclusive nos que não têm ação do comprador, como subscription.past_due e
subscription.canceled:
É o que permite reagir aos eventos sem guardar estado do seu lado: libere o acesso no
transaction.paid — que traz additionalInfo.checkoutLinkId — e suspenda ou revogue no
subscription.past_due / subscription.canceled usando o mesmo chk_, lido direto do evento.
Como toda chave reservada, se o seu metadata definir uma homônima, o valor da Z2Pay prevalece.
O primeiro
transaction.paid sai sem subscriptionId — ele dispara antes de a assinatura
existir. Depois da ativação, a transação daquela compra ganha additionalInfo.subscriptionId
(visível ao consultá-la e nos eventos posteriores dela, como estorno e chargeback). Para ligar
venda e assinatura já no primeiro evento, ouça também subscription.created e correlacione pelo
metadata.checkoutSessionId, que é igual ao referenceCode da transação. Das cobranças
recorrentes em diante, os eventos transaction.* já saem com additionalInfo.subscriptionId.Reconciliação
Você não define um código de referência no Checkout. Não existe camporeferenceCode na
criação de Link, venda rápida ou Session — o que você grava é metadata. Quem preenche o
referenceCode da transação é a Z2Pay, com o id da Session (cs_...).
Para reconciliar por webhook, não espere eventos checkout.session.* — eles são internos e não
existem no catálogo. Use os eventos de transação: transaction.paid e
transaction.refused. A correlação funciona pelos dois lados:
data.id(otxn_) é igual aotransactionIdda Session; oudata.referenceCodeé igual aoidda Session.
data.additionalInfo.checkoutLinkId. O cs_ muda a
cada comprador; o chk_ é o mesmo em todas as vendas do Link — é a chave para mapear “este checkout
entrega tal produto” do seu lado. A chave é reservada: se o seu metadata definir uma
checkoutLinkId, o valor da Z2Pay prevalece. Vendas sem Link (venda rápida, Session avulsa) não a
trazem. O estorno da venda também a carrega: os eventos refund.* e as respostas de
Reembolsos saem com additionalInfo.checkoutLinkId copiado da transação, então o
estorno chega ao Link sem consulta extra.
O metadata que você gravou na Session ou na venda rápida volta em data.additionalInfo, com
as suas chaves no primeiro nível — o metadata do Link fica no Link e não é copiado para a
transação. Os campos customizados preenchidos pelo comprador entram ali sob checkoutCustomFields,
como um array de { key, label, type, value } — só os que foram respondidos.
Veja também
Visão geral do Checkout
Conceitos, casos de uso e mapa de endpoints.
Venda rápida
Cobrança individual, sem template.
Webhooks
Reconcilie por
transaction.paid e transaction.refused.Splits
O modelo de divisão entre recebedores.