SelectwinDOCS
Checkouts

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 availableAtexpiresAt). Quando você cria o link, o servidor:

  1. Persiste o link e gera um id público com o prefixo link_ (trate-o como opaco — veja Convenções).
  2. Assina os parâmetros do link com HMAC SHA256, devolvendo essa assinatura em signature e já embutida na accessFullUrl (no parâmetro de query sign).
  3. 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.

typeComportamentoQuando usar
staticURL reutilizável — várias pessoas podem pagar pelo mesmo link.Campanhas, divulgação em redes sociais, um link fixo para um produto.
dynamicUso ú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, sessionId vem null. Para dynamic, 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çalhoUso
SelectKeyObrigató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/jsonObrigatório em POST e PATCH (requisições com corpo).
X-Idempotency-KeyRecomendado 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

CampoTipoObrigatórioDescrição
typeenumSimstatic (URL reutilizável) ou dynamic (uso único / escopo de sessão).
items[]arraySimItens do link no formato { id, quantity } (mín. 1). id é a variante a vender (var_...); quantity é a quantidade.
domainIdstringNão*Domínio que hospeda o link (dmn_...).
domainstring (uri)Não*URL completa do domínio, quando você não usa domainId.
namestringNãoNome de exibição do link.
expiresAtdatetimeNãoInstante (ISO 8601 UTC) após o qual o link não pode mais ser usado.
availableAtdatetimeNãoInstante (ISO 8601 UTC) a partir do qual o link passa a valer.
editablebooleanNãoPermite o comprador editar as quantidades na página hospedada.
customInputs[]arrayNãoCampos de formulário customizados a coletar no checkout.
discounts[]arrayNãoDescontos pré-aplicados (cupom/regras) sobre o link.
templateIdstringNãoTemplate de checkout para a aparência da página (tmpl_...).
integrationIdstringNãoIntegração associada ao link.
metadataobjectNãoMetadados livres para correlacionar com o seu sistema.

*Use domainId quando o domínio já está cadastrado na Selectwin (recomendado). Use domain apenas para informar a URL completa quando não houver domainId.

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

CampoTipoDescrição
idstringID público do link (link_...). Opaco.
accessFullUrlstringA URL pronta para compartilhar (já assinada). Use esta — não monte a URL manualmente.
signaturestringAssinatura HMAC SHA256 dos parâmetros do link (também embutida em accessFullUrl).
accessIdstringIdentificador de acesso do link (acc_...).
sessionIdstring | nullSessão associada (preenchido só para type: dynamic; null para static).
items[]arrayAs variantes vendidas: { id, quantity }.
type, editable, customInputs, discounts, metadataRefletem o que você enviou (ou os defaults).
expiresAt, availableAtdatetime | nullA janela de validade. null = sem limite naquele lado.
createdAt, updatedAtdatetimeCarimbos 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 caminhoTipoObrigatórioDescrição
paymentLinkIdstringSimID público do link (link_01hqzvabc).
curl -X GET "https://api.selectwin.io/v1/checkouts/payment-links/link_01hqzvabc" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

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âmetroTipoFaixa / EnumDescrição
limitnumber1100 (ex.: 20)Máximo de itens a retornar.
offsetnumber≥ 0 (ex.: 0)Quantos itens pular (paginação).
sortstringascending | descendingOrdem dos resultados.
templateidstringpadrão prefixo_valorFiltra links que usam este template de checkout.
statusstringenabled | disabledFiltra por links habilitados ou desabilitados.
daterangestringISO 8601Filtra por um único dia do calendário; a API expande para o início e o fim daquele dia.
daterangegtstringISO 8601Limite inferior exclusivo (estritamente após).
daterangegtestringISO 8601Limite inferior inclusivo (a partir de).
daterangeltstringISO 8601Limite superior exclusivo (estritamente antes).
daterangeltestringISO 8601Limite 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, createdAt e updatedAtsem items, signature, metadata, merchant ou _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 caminhoTipoObrigatórioDescrição
paymentLinkIdstringSimID 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 caminhoTipoObrigatórioDescrição
paymentLinkIdstringSimID 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.codeHTTPQuando ocorre
invalidParameters400Validação de campos do corpo/query (veja error.params).
domainIdIsInvalid400domainId mal formado.
domainIdNotFound404O domainId informado não existe.
variantIdIsInvalid400Algum items[].id não é uma variante válida.
variantIdNotFound404A variante referenciada em items[] não existe.
couponIdIsInvalid400Cupom inválido em discounts[].
unauthorized401SelectKey ausente, inválida ou revogada.
forbidden403Autenticado, mas sem permissão / limite atingido.
notFound404paymentLinkId inexistente (em consulta, atualização ou exclusão).
unprocessableEntity422Requisição válida sintaticamente, mas viola uma regra de negócio.
tooManyRequests429Limite de requisições excedido — respeite error.retryAfterMinutes.
serverError500Erro interno — repita com backoff.

Catálogo completo e os códigos por recurso: Códigos de Erro.

Boas práticas

  • Sempre compartilhe a accessFullUrl da resposta. Ela já vem assinada; não remonte a URL nem altere o parâmetro sign — isso quebra a verificação HMAC e o link para de funcionar.
  • Use X-Idempotency-Key ao criar. Um timeout de rede num POST sem chave de idempotência pode gerar links duplicados para a mesma campanha.
  • Prefira static para campanhas e dynamic para cobranças personalizadas. Use dynamic quando cada link deve valer para uma única sessão/cliente.
  • Defina a janela de validade explicitamente. Combine availableAt (quando começa) e expiresAt (quando termina) para promoções com data marcada; deixe null o 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, signature ou metadata, faça GET .../{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 / externalReference nos customInputs para correlacionar o link e os dados coletados com o seu próprio sistema.

Veja também

How is this guide?

On this page