Visão geral
Checkouts é o recurso que gera payment links: páginas de pagamento hospedadas pela Selectwin, com URL pronta para compartilhar, para vender uma ou mais variantes de produto sem você precisar construir
Checkouts é o recurso que gera payment links: páginas de pagamento hospedadas pela Selectwin, com URL pronta para compartilhar, para vender uma ou mais variantes de produto sem você precisar construir um checkout próprio. Use quando quiser cobrar por link (WhatsApp, e-mail, bio, QR Code) em vez de integrar um formulário de pagamento na sua aplicação.
O recurso oferece dois fluxos de checkout hospedado: o Payment Link — uma URL reutilizável com CRUD completo sob /v1/checkouts/payment-links (detalhado nesta página) — e a Checkout Session — um carrinho hospedado para uma intenção de compra específica, sob /v1/checkouts/sessions. Esta página foca no objeto Payment Link: o que é, como ele funciona por baixo, seu ciclo de vida e onde encontrar cada operação em detalhe.
O que é um Payment Link
Um payment link é um recurso persistente: você o cria uma vez e ele fica disponível para ser consultado, atualizado ou removido. Ao criar, a API:
- Persiste o link com os
items(variantes + quantidades) que você quer vender; - Gera um identificador público
link_...e umaccessId(acc_...); - Calcula uma assinatura HMAC SHA256 (
signature) sobre os parâmetros do link; - Devolve a
accessFullUrl— a URL completa, já assinada, pronta para o comprador abrir.
Quando alguém abre essa URL, a página hospedada revalida a assinatura e a janela de validade (availableAt/expiresAt) antes de mostrar o checkout. Isso impede que parâmetros do link sejam adulterados na query string.
"Tokenizar/assinar" aqui significa anexar à URL um código (
sign=...) derivado por HMAC do conteúdo do link. Sem a chave secreta da Selectwin é inviável forjar uma URL válida.
Modelo do objeto
JSON de um payment link como retornado por criar, consultar e atualizar (resposta completa):
{
"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"
}| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador público do link (link_...). Opaco — não faça parsing. |
name | string | Nome de exibição do link. |
accessId | string | Identificador de acesso (acc_...) usado na página hospedada. |
signature | string | Assinatura HMAC SHA256 que protege a integridade dos parâmetros. Presente só nas respostas completas (não na listagem). |
accessFullUrl | string | URL completa e assinada, pronta para compartilhar. |
type | string | static (URL reutilizável) ou dynamic (uso único / escopo de sessão). |
sessionId | string | null | Sessão associada a links dynamic; null em links static. |
editable | boolean | Se o comprador pode editar as quantidades na página hospedada. |
customInputs | array | Campos de formulário extras coletados no checkout. |
discounts | array | Descontos pré-aplicados (cupom ou regras) ao link. |
items | array | Variantes a vender. Cada item: { id, quantity } — id é a variante (var_...), quantity é inteiro ≥ 1. |
expiresAt | string (date-time) | Instante (ISO 8601 UTC) após o qual o link não pode mais ser usado. |
availableAt | string | null | Instante a partir do qual o link passa a valer; null = válido imediatamente. |
templateId | string | null | Template de checkout que define o visual (tmpl_...). |
integrationId | string | null | Integração associada ao link. |
domainId | string | Domínio que hospeda o link (dmn_...). |
metadata | object | Pares chave/valor livres armazenados com o link. |
createdAt / updatedAt | string (date-time) | Carimbos de criação e última atualização (ISO 8601 UTC). |
Projeção leve na listagem
A operação de listar devolve uma versão reduzida de cada link: id, name, accessId, accessFullUrl, expiresAt, availableAt, createdAt, updatedAt. Campos como signature, type, items, discounts, customInputs e metadata não aparecem na lista — para obtê-los, faça uma consulta individual.
Valores monetários em toda a API são inteiros em centavos (9900 = R$ 99,00) e datas são ISO 8601 em UTC. Veja Convenções.
Tipos de link
type | Comportamento | Quando usar |
|---|---|---|
static | URL reutilizável: o mesmo link pode gerar várias compras. sessionId fica null. | Campanhas, links de bio, QR Codes em vitrine — qualquer cenário de "muitos compradores, um link". |
dynamic | Escopo de sessão / uso único: pensado para uma transação específica. | Cobrança individual gerada na hora para um cliente (ex.: orçamento aprovado). |
Janela de validade
Dois campos controlam quando o link aceita pagamentos:
availableAt— instante a partir do qual o link começa a valer.nullsignifica "válido desde já".expiresAt— instante após o qual o link deixa de valer.
A página hospedada verifica essa janela junto com a assinatura. Fora da janela (antes de availableAt ou depois de expiresAt), o comprador recebe um erro de link inválido/expirado em vez do checkout.
Ciclo de vida
Depois de criado, o link permanece válido até você o atualizar (ex.: estender expiresAt), excluir ou até passar de expiresAt. A exclusão devolve uma confirmação { id, resource: "checkout-paymentLink", deleted: true }.
Operações
Base URL: https://api.selectwin.io/v1. Todas as requisições exigem o header SelectKey — veja Autenticação.
| Operação | Método e caminho | Detalhe |
|---|---|---|
| Criar link | POST /v1/checkouts/payment-links | Payment Links |
| Listar links | GET /v1/checkouts/payment-links | Payment Links |
| Consultar link | GET /v1/checkouts/payment-links/{paymentLinkId} | Payment Links |
| Atualizar link | PATCH /v1/checkouts/payment-links/{paymentLinkId} | Payment Links |
| Excluir link | DELETE /v1/checkouts/payment-links/{paymentLinkId} | Payment Links |
A criação e a leitura são detalhadas em Payment Links (campos, exemplos curl e respostas completas).
Filtros da listagem
A listagem aceita paginação e filtros (mais em Paginação):
| Parâmetro | Tipo | Faixa / valores | Descrição |
|---|---|---|---|
limit | number | 1..100 | Máximo de itens por página (ex.: 20). |
offset | number | 0.. | Itens a pular. |
sort | enum | ascending | descending | Ordem dos resultados. |
status | enum | enabled | disabled | Filtra por links ativos ou desativados. |
templateid | string | — | Filtra links que usam um template de checkout. |
daterange, daterangegt[e], daterangelt[e] | string (date-time) | — | Filtros por data: dia único, ou limites superior/inferior (exclusivo gt/lt, inclusivo gte/lte). |
Relações com outros recursos
- Variantes (
var_...) — cada item deitemsaponta para uma variante de produto que define preço e cobrança. Os valores são herdados da variante. - Domínios (
dmn_...) —domainIddefine onde o link é hospedado. Alternativamente, passedomain(URL completa) semdomainId. - Templates de checkout (
tmpl_...) —templateIdcontrola o visual da página hospedada. - Descontos / Cupons —
discountspré-aplica cupons ou regras ao link. - Integrações —
integrationIdvincula o link a uma integração configurada.
Conceitos-chave
- Assinatura (HMAC): garante que ninguém altere os parâmetros do link na URL. Você não precisa validá-la — a página hospedada faz isso.
- Idempotência: em escritas (
POST/PATCH), envieX-Idempotency-Keypara evitar duplicar links em caso de retry. Veja Chave de Idempotência. - IDs opacos: trate
link_...,acc_...,var_...,dmn_...como strings opacas — não dependa do formato interno.
Erros
Os endpoints de checkout retornam o envelope de erro padrão; trate sempre pelo error.code, nunca pela message. Veja Tratamento de Erros e o Catálogo de Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
invalidParameters | 400 | Corpo/parâmetro inválido — inclui templateId informado que não existe ou é inválido (campos detalhados em error.params). |
domainIdIsInvalid / domainIdNotFound | 400 / 404 | domainId inválido ou inexistente. |
variantIdIsInvalid / variantIdNotFound | 400 / 404 | Variante de um item inválida ou inexistente. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para a operação. |
unprocessableEntity | 422 | Regra de negócio violada (entidade não processável). |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes. |
serverError | 500 | Erro interno — repita com backoff. |
Boas práticas
- Guarde o
id(link_...), não aaccessFullUrl. A URL pode ser regerada; oidé a chave estável para consultar, atualizar ou excluir o link. - Use
expiresAtem campanhas com prazo. Em vez de excluir o link manualmente, deixe-o expirar — assim ninguém paga fora da janela. - Prefira
staticpara "um link, vários compradores" edynamicpara cobranças individuais de uso único. - Não exponha a
signaturenem tente recalculá-la no cliente — a validação é feita na página hospedada. - Em
PATCH, envie só o que muda. O endpoint é parcial; reenviaritemssubstitui a lista inteira de itens. - Use
X-Idempotency-Keyao criar links disparados por ações de usuário, para não gerar duplicatas em retries de rede. - Para o objeto completo, consulte por
id— a listagem traz só uma projeção leve (semitems,signature,metadata).
Veja também
- Payment Links — referência completa de cada operação (criar, listar, consultar, atualizar, excluir).
- Checkout Sessions — carrinho hospedado para uma intenção de compra específica (alternativa ao link reutilizável).
- Autenticação — header
SelectKey. - Convenções — dinheiro em centavos, datas ISO 8601, IDs opacos, camelCase.
- Paginação —
limit/offset/sorte filtros de data. - Chave de Idempotência — escritas seguras contra retry.
- Tratamento de Erros e Códigos de Erro.
How is this guide?