Links de pagamento
Um Payment Link é uma página de checkout hospedada e compartilhável — uma URL pronta e assinada que você gera para vender uma ou mais variantes de produto sem precisar construir o próprio fluxo de pag
Um Payment Link é uma página de checkout hospedada e compartilhável — uma URL pronta e assinada que você gera para vender uma ou mais variantes de produto sem precisar construir o próprio fluxo de pagamento. Você cria, consulta, lista, atualiza e remove esses links como um recurso persistente, e a API devolve a URL final (accessFullUrl) para você compartilhar com o comprador.
POST · GET · PATCH · DELETE /v1/checkouts/payment-links
Como funciona
Um payment link encapsula o que vender (os items, que são variantes de produto), onde hospedar (domainId ou domain) e quando vale (a janela availableAt → expiresAt). Quando você cria o link, o servidor:
- Persiste o link e gera um
idpúblico com o prefixolink_(trate-o como opaco — veja Convenções). - Assina os parâmetros do link com HMAC SHA256, devolvendo essa assinatura em
signaturee já embutida naaccessFullUrl(no parâmetro de querysign). - Devolve a
accessFullUrl— a URL final, pronta para compartilhar.
Quando o comprador abre a accessFullUrl, a página hospedada revalida a assinatura e a janela de validade (availableAt/expiresAt) antes de exibir o checkout. Isso garante que ninguém adulterou os parâmetros e que o link só funciona dentro do período permitido.
Tokenizar / assinar: "assinar" aqui significa gerar um código (HMAC) derivado dos parâmetros do link mais um segredo seu. Se alguém mudar um parâmetro na URL, a assinatura deixa de bater e a página recusa o acesso.
Tipos de link: static vs. dynamic
type | Comportamento | Quando usar |
|---|---|---|
static | URL reutilizável — várias pessoas podem pagar pelo mesmo link. | Campanhas, divulgação em redes sociais, um link fixo para um produto. |
dynamic | Uso único / escopo de sessão — vinculado a uma sessão de checkout. | Cobranças personalizadas por cliente, carrinhos montados na hora. Nesse caso o campo sessionId da resposta é preenchido. |
Para links
static,sessionIdvemnull. Paradynamic, ele identifica a sessão associada.
Quando usar (e quando não usar)
Use Payment Links quando você quer cobrar sem hospedar/construir o próprio checkout: basta gerar a URL e compartilhar (WhatsApp, e-mail, bio de rede social, botão "Comprar"). É a forma mais rápida de começar a vender.
Considere outra abordagem quando você já tem um checkout próprio e só precisa processar o pagamento no backend — nesse caso use diretamente o recurso de Transações, que dá controle total sobre o fluxo (sem página hospedada).
Requisição
Headers
| Cabeçalho | Uso |
|---|---|
SelectKey | Obrigatório. Sua chave de API. Produção começa com sl_live_; sandbox com sl_test_. Nunca use Authorization: Bearer/Basic. Veja Autenticação. |
Content-Type: application/json | Obrigatório em POST e PATCH (requisições com corpo). |
X-Idempotency-Key | Recomendado em POST. Garante que repetir a mesma criação (ex.: após timeout de rede) não gere links duplicados. Veja Idempotência. |
Criar — POST /v1/checkouts/payment-links
curl -X POST "https://api.selectwin.io/v1/checkouts/payment-links" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: 1f8d2c6a-7b9e-4a1d-8c3f-0e2b4d6f8a10" \
-d '{
"type": "static",
"name": "Black Friday PIX",
"items": [ { "id": "var_01hqzvabc", "quantity": 1 } ],
"domainId": "dmn_abc123",
"editable": false,
"expiresAt": "2026-12-31T23:59:59Z"
}'Campos do corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
type | enum | Sim | static (URL reutilizável) ou dynamic (uso único / escopo de sessão). |
items[] | array | Sim | Itens do link no formato { id, quantity } (mín. 1). id é a variante a vender (var_...); quantity é a quantidade. |
domainId | string | Não* | Domínio que hospeda o link (dmn_...). |
domain | string (uri) | Não* | URL completa do domínio, quando você não usa domainId. |
name | string | Não | Nome de exibição do link. |
expiresAt | datetime | Não | Instante (ISO 8601 UTC) após o qual o link não pode mais ser usado. |
availableAt | datetime | Não | Instante (ISO 8601 UTC) a partir do qual o link passa a valer. |
editable | boolean | Não | Permite o comprador editar as quantidades na página hospedada. |
customInputs[] | array | Não | Campos de formulário customizados a coletar no checkout. |
discounts[] | array | Não | Descontos pré-aplicados (cupom/regras) sobre o link. |
templateId | string | Não | Template de checkout para a aparência da página (tmpl_...). |
integrationId | string | Não | Integração associada ao link. |
metadata | object | Não | Metadados livres para correlacionar com o seu sistema. |
*Use
domainIdquando o domínio já está cadastrado na Selectwin (recomendado). Usedomainapenas para informar a URL completa quando não houverdomainId.
Valores monetários e datas
Não há amount aqui: o preço vem das variantes (items[].id). Todo valor monetário na API é inteiro em centavos e toda data é ISO 8601 em UTC (2026-12-31T23:59:59.000Z). Veja Convenções.
Resposta da criação
201 Created
{
"id": "link_01hqzvabc",
"name": "Black Friday PIX",
"accessId": "acc_01hqzvabc",
"signature": "f62a0cb72d7a5d55052c96301013e64627133231f90c4614b10d0f50b9887f8d",
"accessFullUrl": "https://pay.example.com/p/link_01hqzvabc?sign=f62a0cb7...",
"type": "static",
"sessionId": null,
"editable": false,
"customInputs": [],
"discounts": [],
"items": [ { "id": "var_01hqzvabc", "quantity": 1 } ],
"expiresAt": "2026-12-31T23:59:59.000Z",
"availableAt": null,
"templateId": null,
"integrationId": null,
"domainId": "dmn_abc123",
"metadata": {},
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}Campos-chave da resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID público do link (link_...). Opaco. |
accessFullUrl | string | A URL pronta para compartilhar (já assinada). Use esta — não monte a URL manualmente. |
signature | string | Assinatura HMAC SHA256 dos parâmetros do link (também embutida em accessFullUrl). |
accessId | string | Identificador de acesso do link (acc_...). |
sessionId | string | null | Sessão associada (preenchido só para type: dynamic; null para static). |
items[] | array | As variantes vendidas: { id, quantity }. |
type, editable, customInputs, discounts, metadata | — | Refletem o que você enviou (ou os defaults). |
expiresAt, availableAt | datetime | null | A janela de validade. null = sem limite naquele lado. |
createdAt, updatedAt | datetime | Carimbos ISO 8601 UTC. |
Importante
As respostas de payment link não incluem merchant nem o bloco HATEOAS _links.
Consultar — GET /v1/checkouts/payment-links/{paymentLinkId}
Retorna o objeto completo de um link pelo seu ID (link_...) — mesma forma da resposta de criação (com signature, items, metadata, etc.).
| Parâmetro de caminho | Tipo | Obrigatório | Descrição |
|---|---|---|---|
paymentLinkId | string | Sim | ID público do link (link_01hqzvabc). |
curl -X GET "https://api.selectwin.io/v1/checkouts/payment-links/link_01hqzvabc" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Listar — GET /v1/checkouts/payment-links
Lista os links de forma paginada. Os itens da lista são projeções leves: cada entrada traz só um subconjunto de campos. Para o objeto completo (com items, signature, metadata…), use a consulta individual.
Parâmetros de query
| Parâmetro | Tipo | Faixa / Enum | Descrição |
|---|---|---|---|
limit | number | 1–100 (ex.: 20) | Máximo de itens a retornar. |
offset | number | ≥ 0 (ex.: 0) | Quantos itens pular (paginação). |
sort | string | ascending | descending | Ordem dos resultados. |
templateid | string | padrão prefixo_valor | Filtra links que usam este template de checkout. |
status | string | enabled | disabled | Filtra por links habilitados ou desabilitados. |
daterange | string | ISO 8601 | Filtra por um único dia do calendário; a API expande para o início e o fim daquele dia. |
daterangegt | string | ISO 8601 | Limite inferior exclusivo (estritamente após). |
daterangegte | string | ISO 8601 | Limite inferior inclusivo (a partir de). |
daterangelt | string | ISO 8601 | Limite superior exclusivo (estritamente antes). |
daterangelte | string | ISO 8601 | Limite superior inclusivo (até). |
Veja Paginação para o padrão de limit/offset/page.
curl -X GET "https://api.selectwin.io/v1/checkouts/payment-links?limit=20&status=enabled&sort=descending" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Resposta 200 OK
{
"offset": 0,
"limit": 20,
"total": 3,
"page": { "current": 1, "total": 1, "offset": { "first": 0, "prev": null, "next": null, "last": 0 } },
"data": [
{
"id": "link_01hqzvabc",
"name": "Black Friday PIX",
"accessId": "acc_01hqzvabc",
"accessFullUrl": "https://pay.example.com/p/link_01hqzvabc?sign=f62a0cb7...",
"expiresAt": "2026-12-31T23:59:59.000Z",
"availableAt": null,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"hasMore": false
}A projeção da lista expõe
id,name,accessId,accessFullUrl,expiresAt,availableAt,createdAteupdatedAt— semitems,signature,metadata,merchantou_links.
Atualizar — PATCH /v1/checkouts/payment-links/{paymentLinkId}
Atualização parcial: envie apenas os campos que mudam. Os campos não enviados permanecem como estão. Retorna o objeto completo atualizado (200 OK).
Campos atualizáveis: name, items, domainId/domain, expiresAt, availableAt, editable, customInputs, discounts, templateId, metadata.
| Parâmetro de caminho | Tipo | Obrigatório | Descrição |
|---|---|---|---|
paymentLinkId | string | Sim | ID público do link (link_01hqzvabc). |
curl -X PATCH "https://api.selectwin.io/v1/checkouts/payment-links/link_01hqzvabc" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-d '{ "name": "Campanha atualizada", "expiresAt": "2027-01-31T23:59:59Z" }'Nota
type e integrationId não estão na lista de campos atualizáveis — defina-os na criação. Se precisar mudar o tipo do link, crie um novo.
Excluir — DELETE /v1/checkouts/payment-links/{paymentLinkId}
Remove um payment link. Após a exclusão, a accessFullUrl deixa de funcionar para novos compradores. A operação é irreversível — para reativar, crie um novo link.
| Parâmetro de caminho | Tipo | Obrigatório | Descrição |
|---|---|---|---|
paymentLinkId | string | Sim | ID público do link (link_01hqzvabc). |
curl -X DELETE "https://api.selectwin.io/v1/checkouts/payment-links/link_01hqzvabc" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Resposta 200 OK (confirmação para clientes legados):
{ "id": "link_01hqzvabc", "resource": "checkout-paymentLink", "deleted": true }Erros
A API retorna um envelope padrão com error.code estável — trate pelo code, nunca pela message. Em falhas de validação, error.params detalha os campos. Veja Tratamento de Erros.
error.code | HTTP | Quando ocorre |
|---|---|---|
invalidParameters | 400 | Validação de campos do corpo/query (veja error.params). |
domainIdIsInvalid | 400 | domainId mal formado. |
domainIdNotFound | 404 | O domainId informado não existe. |
variantIdIsInvalid | 400 | Algum items[].id não é uma variante válida. |
variantIdNotFound | 404 | A variante referenciada em items[] não existe. |
couponIdIsInvalid | 400 | Cupom inválido em discounts[]. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão / limite atingido. |
notFound | 404 | paymentLinkId inexistente (em consulta, atualização ou exclusão). |
unprocessableEntity | 422 | Requisição válida sintaticamente, mas viola uma regra de negócio. |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes. |
serverError | 500 | Erro interno — repita com backoff. |
Catálogo completo e os códigos por recurso: Códigos de Erro.
Boas práticas
- Sempre compartilhe a
accessFullUrlda resposta. Ela já vem assinada; não remonte a URL nem altere o parâmetrosign— isso quebra a verificação HMAC e o link para de funcionar. - Use
X-Idempotency-Keyao criar. Um timeout de rede numPOSTsem chave de idempotência pode gerar links duplicados para a mesma campanha. - Prefira
staticpara campanhas edynamicpara cobranças personalizadas. Usedynamicquando cada link deve valer para uma única sessão/cliente. - Defina a janela de validade explicitamente. Combine
availableAt(quando começa) eexpiresAt(quando termina) para promoções com data marcada; deixenullo lado que não precisa de limite. - Não confie na lista para o objeto completo. A listagem é uma projeção leve — para ler
items,signatureoumetadata, façaGET .../{paymentLinkId}. - No
PATCH, envie só o que muda. Reenviar o objeto inteiro é desnecessário e arriscado (pode sobrescrever campos sem querer); a atualização é parcial. - Trate IDs como opacos (
link_,dmn_,var_…): armazene a string inteira, não faça parsing nem confie no comprimento. - Use
metadata/externalReferencenoscustomInputspara correlacionar o link e os dados coletados com o seu próprio sistema.
Veja também
- Visão geral de Checkouts — o recurso, o ciclo de vida do link e a assinatura HMAC.
- Convenções da API — camelCase, centavos, ISO 8601, IDs opacos.
- Autenticação — o header
SelectKey. - Idempotência — evitar criações duplicadas.
- Paginação —
limit/offsetna listagem. - Códigos de Erro —
error.codepor recurso.
How is this guide?