Visão geral
O recurso Cartões guarda, de forma tokenizada, os cartões de crédito/débito dos seus clientes para que você possa cobrá-los depois sem precisar manipular os dados sensíveis a cada compra. Tokenizar si
O recurso Cartões guarda, de forma tokenizada, os cartões de crédito/débito dos seus clientes para que você possa cobrá-los depois sem precisar manipular os dados sensíveis a cada compra. Tokenizar significa trocar o número do cartão por um identificador opaco (card_...): você passa a referenciar esse token nas cobranças, e o número real do cartão (o PAN) nunca trafega nem fica armazenado no seu sistema.
O que é um cartão na Selectwin
Cada cartão pertence a um cliente (Customer) e funciona como um meio de pagamento reutilizável. Você envia os dados completos do cartão uma vez (no momento da criação); a API os tokeniza e devolve um objeto sem o número completo nem o código de segurança. A partir daí, você usa o id do cartão para cobrar em transações, assinaturas e cobranças recorrentes — sem nunca mais ver ou enviar o número do cartão.
Esse fluxo é o que mantém sua integração dentro do escopo reduzido de conformidade PCI DSS: o dado sensível entra uma vez pelo canal da plataforma e sai como token.
Conceitos importantes:
- Cliente dono (holder): todo cartão é vinculado a um
customerId. Um cliente pode ter vários cartões; apenas um pode ser o primário (primary). - Token opaco: o
id(card_...) é um identificador estável e opaco — armazene a string inteira, não faça parsing. Veja Convenções. - Sem PAN, sem CVV: a resposta expõe só os primeiros (
firstDigits) e últimos (lastDigits) dígitos. O número completo e osecurityCodenunca são retornados nem armazenados.
Modelo do objeto
Abaixo, o objeto de cartão como retornado por Create e Read (anotado):
{
"id": "card_01hqzvabc", // identificador opaco do cartão (token)
"holderName": "JOÃO SILVA", // nome impresso no cartão
"brand": "visa", // bandeira detectada a partir do número
"firstDigits": "411111", // 6 primeiros dígitos (BIN) — exibição/identificação
"lastDigits": "1111", // 4 últimos dígitos — exibição/identificação
"expirationMonth": "12", // mês de validade (string na saída)
"expirationYear": "2025", // ano de validade (string na saída)
"primary": true, // é o cartão primário do cliente?
"active": true, // token ativo (não excluído)
"valid": true, // passou nas validações (Luhn, etc.)
"verified": true, // verificado junto ao emissor
"associated": true, // associado a um cliente
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z",
"metadata": {}, // objeto livre para seus próprios dados
"merchant": { // estabelecimento dono do recurso
"name": "Seller Name",
"merchantId": "bus_1234567890",
"isSubAccount": false
},
"_links": { // links HATEOAS para próximas ações
"self": { "href": "https://api.selectwin.io/v1/cards/card_01hqzvabc", "method": "GET" },
"update": { "href": "https://api.selectwin.io/v1/cards/card_01hqzvabc", "method": "PUT" }, // presente na resposta, mas sem operação pública (veja nota abaixo)
"delete": { "href": "https://api.selectwin.io/v1/cards/card_01hqzvabc", "method": "DELETE" }
}
}Campos principais
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador opaco do cartão (card_...). Use-o para ler, excluir e cobrar. |
holderName | string | Nome do portador como impresso no cartão. |
brand | string | Bandeira detectada a partir do número (ex.: visa, mastercard). |
firstDigits | string | 6 primeiros dígitos (BIN). Para exibição/identificação. |
lastDigits | string | 4 últimos dígitos. Para exibição/identificação. |
expirationMonth | string | Mês de validade. Na saída vem como string ("12"); na criação é enviado como número (1–12). |
expirationYear | string | Ano de validade. Na saída vem como string; na criação é enviado como número. |
primary | boolean | Indica se é o cartão primário (padrão) do cliente. |
active | boolean | Token ativo. Fica false após exclusão. |
valid | boolean | Passou nas validações estruturais (ex.: Luhn). |
verified | boolean | Verificado junto ao emissor. |
associated | boolean | Vinculado a um cliente. |
createdAt / updatedAt | string (date-time) | Timestamps em ISO 8601 UTC (...Z). |
metadata | object | Objeto livre para você correlacionar com seu sistema. |
merchant | object | Estabelecimento dono do recurso (name, merchantId, isSubAccount). |
_links | object | Links HATEOAS (self, delete, list, …) para as próximas ações. A resposta também inclui um link update (PUT), mas não há operação pública de atualização de cartão — veja a nota abaixo. |
Importante
A resposta traz um link update com método PUT em _links, mas não existe uma operação pública para atualizar um cartão (nenhuma página Atualizar cartão e nenhum endpoint documentado). Trate esse link como reservado: não o chame. Para alterar os dados de um cartão, exclua o token atual e crie um novo cartão com os dados corretos.
Importante
As flags mudam de nome conforme a operação. Em Create e Read, são planas: primary, active, valid, verified, associated. Já na listagem (GET /v1/cards), cada item de data[] usa o prefixo is: isPrimary, isActive, isValid, isVerified, isAssociated. Trate ambos os formatos no seu código.
Nota
Itens de lista são projeções leves: não trazem merchant, metadata nem _links por item. Para o objeto completo, consulte o cartão individual com Consultar cartão. Em Read, campos como primary e metadata podem vir null quando não houver valor. Veja a regra de null em Convenções.
Ciclo de vida
- Criação (tokenização). Você envia os dados completos do cartão para
POST /v1/cards. A API valida (Luhn, validade, bandeira), tokeniza e devolve o objeto (201). Se os dados não passam, retorna erro (ex.:invalidCardData,cardExpired,cardBrandNotSupported). - Uso. Com o cartão ativo, você o referencia pelo
idem cobranças (transações, assinaturas). Um cliente pode acumular vários cartões; defina um comoprimarypara usá-lo por padrão. - Exclusão.
DELETE /v1/cards/{cardId}invalida o token para novas cobranças. É irreversível: para cobrar de novo, é preciso tokenizar o cartão outra vez. Veja Excluir cartão.
Operações
| Operação | Método e caminho | Descrição |
|---|---|---|
| Criar cartão | POST /v1/cards | Cadastra e tokeniza um cartão para um cliente. |
| Consultar cartão | GET /v1/cards/{cardId} | Retorna o objeto completo de um cartão. |
| Listar cartões | GET /v1/cards | Lista cartões com paginação e filtros (ex.: por holderid). |
| Excluir cartão | DELETE /v1/cards/{cardId} | Remove (invalida) o token do cartão. |
Base URL: https://api.selectwin.io/v1. Todas as chamadas exigem o cabeçalho SelectKey (nunca Authorization: Bearer/Basic) — veja Autenticação.
curl https://api.selectwin.io/v1/cards \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Em sandbox, a chave começa com
sl_test_.
Bandeira (brand)
O campo brand é preenchido automaticamente pela API a partir do número do cartão — você não o envia na criação. É uma string; os valores observados nas respostas incluem bandeiras como visa, mastercard, american-express, elo, hipercard, diners-club, discover, jcb e aura. Trate brand como rótulo de exibição, não como um enum fechado: use-o para mostrar o ícone correto, mas não codifique regras rígidas em cima de valores específicos. Se a bandeira não for suportada na criação, a API retorna cardBrandNotSupported (422).
Erros
Códigos específicos do recurso Cartões (além dos transversais 401, 403, 422, 429, 500). Trate sempre pelo error.code, nunca pela message — veja o Catálogo de Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
cardNotFound / cardIdNotFound | 404 | Cartão não encontrado (id inexistente ou já excluído). |
cardIdIsInvalid / transactionCardIdInvalid | 400 | Formato do ID do cartão inválido. |
transactionCardInvalid | 400 | Cartão inválido para a transação. |
cardExpired | 400 | Cartão com validade vencida. |
invalidCardData | 422 | Dados do cartão inválidos (número, validade, CVV). |
cardBrandNotSupported | 422 | Bandeira do cartão não suportada. |
cardCreateNotProcessable | 422 | Não foi possível processar a criação do cartão. |
cardAndCustomerOfCompanyNotSame | 422 | Cartão e cliente não pertencem ao mesmo estabelecimento. |
limitReached | 403 | Limite de cartões atingido. |
invalidParameters | 400 | Falha de validação genérica (detalhes em error.params). |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
tooManyRequests | 429 | Limite de requisições excedido (respeite error.retryAfterMinutes). |
serverError | 500 | Erro interno — repita com backoff. |
Boas práticas
- Tokenize uma vez, cobre muitas. Crie o cartão uma única vez e reutilize o
idnas cobranças. Nunca guarde o número completo do cartão no seu lado. - Nunca exiba o PAN. Para mostrar o cartão na sua interface, use
brand+lastDigits(ex.: "Visa •••• 1111"). É só o que a API devolve, e é suficiente. - Trate as duas formas das flags.
primary/active/… em Create e Read;isPrimary/isActive/… na listagem. Normalize no seu código para evitarundefined. - Defina um cartão primário. Marque um cartão como
primary: truepara usá-lo por padrão e melhorar a experiência de checkout. - Antecipe o vencimento. Compare
expirationMonth/expirationYearcom a data atual e peça um novo cartão antes que falhe uma cobrança recorrente. - Garanta a posse antes de cobrar. O cartão e o cliente da cobrança precisam ser do mesmo estabelecimento, senão você verá
cardAndCustomerOfCompanyNotSame. - Use idempotência na criação. Envie
X-Idempotency-KeynoPOSTpara não tokenizar o mesmo cartão duas vezes em caso de retry — veja Idempotência. - Trate erros pelo
code. Decida o fluxo (pedir outro cartão, reverificar dados) com base noerror.code, não na mensagem.
Relações com outros recursos
- Customers: todo cartão pertence a um cliente, referenciado por
customerIdna criação. - Transactions: o cartão tokenizado é o meio de pagamento usado para processar cobranças.
- Subscriptions: cartões salvos viabilizam cobranças recorrentes em assinaturas.
Veja também
How is this guide?