Skip to main content
POST
POST /checkout/links Faz parte do recurso Links — o conceito, a Session gerada e os estados estão lá. Cria o template e devolve 201 com o Link inteiro, já com a url de pagamento. São obrigatórios os itens e os métodos de pagamento; o resto tem default ou é opcional. O Link nasce active e passa a vender na hora — cada abertura da URL materializa uma Session nova.
Valores são inteiros em centavos. R$ 99,90 é 9990. Enviar 9.90 é recusado com 400 (integer requerido), mas 9 passa e vira nove centavos. Veja Convenções.
Split exige soma 100 e exatamente um responsável. As percentage somam 100 (tolerância de ±0.01 para arredondamento) e um único item do array tem liable: true — nenhum ou mais de um é recusado com 400. O responsável é obrigatório porque chargeback sempre precisa de um dono; não existe divisão em que o prejuízo fique sem endereço.
O slug é único globalmente, não só na sua conta. Se outra conta já usa aquele texto, a resposta é 409 com key: "errors.checkout.slug_taken". Quando você envia um slug, a url da resposta já vem como /c/{slug} em vez de /c/{id}.
select sem options é aceito, e quebra na página. A API não recusa um campo customizado do tipo select sem opções — ele é criado e o comprador vê um dropdown vazio, sem como responder. Confira antes de publicar.
E-mail, documento e telefone sempre são exigidos. O checkout os mescla em requiredFields mesmo que você não os liste — por isso a resposta nunca traz o campo vazio —, e confere o dígito verificador do documento. address é o único opt-in: só entra se você o listar. O nome o comprador informa na página, mas não há como torná-lo obrigatório — name não é um valor aceito em requiredFields.
A escrita é plana, a leitura é aninhada. Aqui você envia items, paymentMethods, splits e branding no topo do corpo. Na leitura (GET /checkout/links/{id}) esses quatro voltam dentro de config. Os demais campos ficam no topo nos dois sentidos. O detalhe importa ao espelhar um Link numa venda rápida.
O conflito de domínio não vai em code. Todo 409 de regra responde code: "CONFLICT" — o que distingue um caso do outro é a key, com o prefixo inteiro (errors.checkout.slug_taken). Comparar error.code === "slug_taken" nunca casa. Veja Erros de domínio.
Endpoint idempotente. Envie Idempotency-Key para que um retry por timeout não crie dois Links. Veja Convenções.

Exemplo

Resposta 201
A url da resposta é o link pronto para compartilhar. Cada abertura materializa uma Session nova.

Authorizations

x-api-key
string
header
required

API key unificada (z2_{live|test}{sk|pk}...) — secret (sk) para integração backend, publishable (pk) para uso no frontend público

Body

application/json
paymentMethods
object
required

Métodos de pagamento habilitados (card/pix/boleto/combined); ao menos um enabled.

name
string | null

Nome do link de checkout.

Maximum string length: 255
description
string | null

Descrição exibida no checkout.

Maximum string length: 2000
slug
string | null

Slug único global usado na URL pública /c/{slug} (a-z, 0-9 e hífen).

Required string length: 3 - 100
Pattern: ^[a-z0-9-]+$
mode
enum<string>
default:payment

'payment' (default) para pagamento único; 'subscription' exige o objeto subscription populado.

Available options:
payment,
subscription
currency
enum<string>
default:BRL

Moeda da cobrança. Só BRL — os gateways liquidam em real.

Available options:
BRL
locale
enum<string>
default:pt-BR

Idioma do checkout (default 'pt-BR').

Available options:
pt-BR,
en-US,
es-ES
items
object[]

Itens do carrinho (unitAmount em centavos); ao menos 1 quando mode=payment.

splits
object[] | null

Divisão de receita por percentual; a soma deve ser exatamente 100.

branding
object | null

Customização visual do checkout.

subscription
object | null

Configuração de recorrência; obrigatória (e exclusiva) quando mode=subscription.

requiredFields
enum<string>[] | null

Campos do comprador exigidos no checkout (email, document, phone, address).

Available options:
email,
document,
phone,
address
customFields
object[] | null

Campos customizados do formulário (máx. 20).

Maximum array length: 20
successUrl
string<uri> | null

URL de redirecionamento após pagamento aprovado.

Maximum string length: 2000
cancelUrl
string<uri> | null

URL de redirecionamento quando o comprador cancela.

Maximum string length: 2000
metadata
object | null

Metadados do seller (string → string), consultáveis no próprio link. Não são propagados à Transaction; para correlacionar vendas ao link nos webhooks, use o additionalInfo.checkoutLinkId da Transaction.

expirationMinutes
integer | null

Expiração da sessão em minutos (5 a 43200 = 30 dias).

Required range: 5 <= x <= 43200

Response

Link criado

id
string

Identificador único do registro.

slug
string | null

Slug único global usado na URL pública /c/{slug}.

status
string

Estado atual do registro.

mode
string

Modo do checkout: 'payment' (pagamento único) ou 'subscription' (assinatura).

currency
string

Moeda no padrão ISO 4217 (ex.: BRL).

locale
string

Idioma do checkout (ex.: pt-BR, en-US, es-ES).

name
string | null

Nome de exibição do registro.

description
string | null

Descrição exibida no checkout.

sellable
boolean

Se o Link pode vender agora. É false quando um recebedor do splits, ou o dono da conta, não está ativo no PSP — o comprador vê uma página de indisponível. Independente do status.

config
object

Snapshot da configuração do checkout (formas de pagamento, itens e personalização visual).

requiredFields
string[] | null

Campos do comprador exigidos no checkout (ex.: email, document, phone, address).

customFields
object[] | null

Definições dos campos personalizados solicitados no checkout.

successUrl
string | null

URL de redirecionamento após o pagamento ser concluído com sucesso.

cancelUrl
string | null

URL de redirecionamento quando o comprador cancela o checkout.

metadata
object | null

Metadados livres (pares chave-valor) para uso do integrador; não afeta o processamento.

expirationMinutes
integer | null

Tempo de validade da sessão de checkout, em minutos.

createdAt
string<date-time>

Data e hora de criação do registro (ISO 8601).

updatedAt
string<date-time>

Data e hora da última atualização do registro (ISO 8601).

url
string

URL pública do checkout para o comprador finalizar o pagamento.