Cartões - Criar
Visão Geral
Este endpoint permite registrar um novo cartão de crédito de forma segura, possibilitando usá-lo em transações futuras, mediante autorização do titular.
Precauções
- Segurança: Os dados do cartão são transmitidos de forma segura usando criptografia TLS/SSL.
- Conformidade PCI: Garanta que sua aplicação esteja em conformidade com as diretrizes PCI DSS ao capturar dados de cartões.
- Validação: O sistema realiza validações básicas do número do cartão antes do processamento.
- Tokens: Considere usar tokenização para minimizar o manuseio direto de dados de cartão.
Descrição
O endpoint Criar Cartão permite cadastrar um novo cartão no sistema, associando-o a um cliente específico. Os dados são validados e o cartão é tokenizado para uso em transações futuras.
Requisição
POST /v1/cardsCorpo da Requisição
Forma 1 — token do navegador (recomendada para página própria):
{
"customerId": "cus_123456789",
"token": "a1b2c3d4e5f6…",
"primary": true
}Forma 2 — dados completos do cartão:
{
"numbering": "4111111111111111",
"holderName": "João Silva",
"expirationMonth": 12,
"expirationYear": 2030,
"securityCode": "123",
"customerId": "cus_123456789",
"primary": true
}Parâmetros da Requisição
| Parâmetro | Tipo | Obrigatório | Descrição | Exemplo |
|---|---|---|---|---|
customerId | string | Sim | ID do cliente (cus_*) ao qual o cartão será associado | "cus_123456789" |
token | string | Sim* | Token de uso único cunhado no navegador (Tokenização no navegador). *Alternativa aos dados completos; quando enviado, nenhum campo de cartão pode vir junto | "a1b2c3d4e5f6…" |
holderName | string | Sim** | Nome completo do titular (3 a 255 caracteres). **Obrigatório sem token | "João Silva" |
numbering | string | Sim** | Número completo do cartão (validado por Luhn). **Obrigatório sem token | "4111111111111111" |
expirationMonth | integer | Sim** | Mês de validade (1 a 12). **Obrigatório sem token | 12 |
expirationYear | integer | Sim** | Ano de validade. Aceita 4 dígitos (2030) ou 2 dígitos (30 → 2030). Não pode estar no passado. **Obrigatório sem token | 2030 |
securityCode | string | Sim** | Código de segurança / CVV (3 ou 4 dígitos). Nunca é retornado. **Obrigatório sem token | "123" |
primary | boolean | Não | Define se este é o cartão principal do cliente. Quando omitido, assume true | true |
Resposta - 201 Created
Se a requisição for bem-sucedida, um objeto JSON com os detalhes do cartão criado é retornado.
Exemplo de Resposta
Resposta root (create retorna shape completo de leitura do cartão tokenizado + merchant/_links).
{
"id": "card_01hqzvabc",
"holderName": "João Silva",
"brand": "Visa",
"firstDigits": "411111",
"lastDigits": "1111",
"expirationMonth": "12",
"expirationYear": "2030",
"primary": true,
"active": true,
"valid": true,
"verified": false,
"associated": false,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z",
"merchant": {
"name": "Seller Name",
"merchantId": "bus_1234567890",
"isSubAccount": false
},
"_links": {
"self": {
"href": "https://api.selectwin.io/v1/cards/card_01hqzvabc",
"method": "GET",
"description": "Read a card."
},
"delete": {
"href": "https://api.selectwin.io/v1/cards/card_01hqzvabc",
"method": "DELETE",
"description": "Delete the card."
},
"list": {
"href": "https://api.selectwin.io/v1/cards",
"method": "GET",
"description": "List all cards."
}
}
}Atributos da Resposta
| Atributo | Tipo | Descrição |
|---|---|---|
id | string | Identificador único (card_*) |
holderName | string | Nome do titular (normalizado para Title Case) |
brand | string | Bandeira capitalizada (Visa, Mastercard, Amex, Elo, ...) |
firstDigits | string | BIN (6 primeiros dígitos). Num cartão criado por token, os 4 primeiros |
lastDigits | string | Últimos 4 dígitos |
expirationMonth | string | Mês de validade (2 dígitos, ex.: "12") |
expirationYear | string | Ano de validade (4 dígitos, ex.: "2030") |
primary | boolean | Cartão principal |
active | boolean | Ativo (true na criação) |
valid | boolean | Válido (true na criação) |
verified | boolean | Verificado (false na criação) |
associated | boolean | null | Associado ao cliente. false na criação pelos dados completos (a associação roda em seguida; depois, true ou false). null (pendente) na criação por token — o token foi cunhado no navegador de um comprador, então é uma porta do comprador, como o checkout hospedado, o portal e o payment.card de uma cobrança/assinatura — até a 1ª cobrança aprovada com o cartão; o cartão já pode ser cobrado. Ver Visão geral |
createdAt / updatedAt | string (date-time) | Timestamps ISO 8601 |
merchant | object | Bloco do merchant (name, merchantId, isSubAccount) |
_links | object | HATEOAS (self, create, delete, list) |
Notas:
- O corpo da requisição usa
primary; a resposta usa os nomes sem prefixois(primary,active,valid,verified,associated). - O recurso de cartão não retorna
metadata. - Cartões são criados com
verified: false; a verificação ocorre posteriormente no fluxo de pagamento.
Respostas de Erro
Todas as respostas de erro seguem o envelope canônico { "error": { status, statusCode, category, code, message, resource, details?, params? } }.
400 Bad Request - Bandeira não suportada
{
"error": {
"status": "Bad Request",
"statusCode": 400,
"category": "validation",
"code": "cardBrandNotSupported",
"message": "Card brand not supported.",
"resource": "card",
"details": "The card brand is not supported. Please check the card brand and try again."
}
}400 Bad Request - Cartão expirado
{
"error": {
"status": "Bad Request",
"statusCode": 400,
"category": "validation",
"code": "cardExpired",
"message": "Card expired",
"resource": "card",
"details": "The provided card has expired. Please use a valid card."
}
}404 Not Found - Cliente inválido
Retornado quando o customerId informado não existe.
{
"error": {
"status": "Not Found",
"statusCode": 404,
"category": "client",
"code": "invalidCustomerId",
"message": "Invalid customer ID.",
"resource": "customer"
}
}Códigos de erro deste endpoint
| HTTP | code | Quando ocorre |
|---|---|---|
| 400 | (validação de campo) | Campos ausentes/ inválidos no corpo (Luhn, CVV, mês/ano). Inclui o array params por campo |
| 400 | cardExpired | Mês/ano de validade já passou |
| 400 | cardBrandNotSupported | Bandeira detectada fora da lista de bandeiras aceitas |
| 401 | — | SelectKey ausente ou inválida |
| 403 | — | Chave sem o escopo cards:create |
| 404 | invalidCustomerId | customerId não encontrado |
| 409 | — | Conflito de idempotência |
| 422 | cardTokenInvalid | token desconhecido, expirado (1 h) ou já usado |
| 422 | cardDeclined | O cartão do token foi recusado na validação |
| 422 | cardTokenCustomerUnavailable | O cliente não pôde ser cadastrado para receber o cartão (dados incompletos/recusados) |
| 429 | cardAssociationRateLimited | Não é mais devolvido por este endpoint. O teto de associações da conta vale para o cadastro com o cartão completo, que é assíncrono: acima do teto o cartão é criado, mas fica associated: false e só é validado na primeira cobrança. Com token (cunhado no navegador do comprador) e nos cartões que os compradores digitam — no checkout hospedado, no portal e o cartão enviado DENTRO de uma cobrança ou assinatura (payment.card) — conta a janela de cada comprador e um teto da loja para essas portas, que nunca responde 429: no teto, a validação prévia é adiada e o cartão é validado antes da cobrança. O cartão do token sai associated: null até a 1ª cobrança aprovada |
| 503 | cardTokenAssociationFailed | A validação do cartão do token não respondeu a tempo. Nada foi cobrado; tente de novo com um token novo |
| 503 | tokenizationNotConfigured | Ambiente sem tokenização no navegador |
| 500 | — | Erro interno |
Casos de Uso
- Checkout em E-commerce: Permitir que o cliente salve um novo cartão durante o processo de compra
- Registro em Aplicativos: Permitir que usuários adicionem cartões ao se cadastrarem ou posteriormente
- Subscrições e Recorrências: Adicionar um cartão para cobranças recorrentes futuras
- Atualização após Expiracao: Substituir um cartão expirado por uma nova versão
Melhores Práticas
- Validações no Cliente: Realize validações básicas do número do cartão, data de validade e CVV no frontend antes de enviar para a API
- Mascaramento de Dados: Mascare os dados do cartão na interface do usuário
- Criptografia: Utilize conexões seguras (HTTPS) e considere métodos adicionais de criptografia
- Confirmação do Titular: Implemente métodos para confirmar que o usuário tem permissão para usar o cartão
- Gestão de Erros: Forneça feedback claro aos usuários quando houver problemas na validação do cartão
Integração com Outros Endpoints
- Para não lidar com dado de cartão no seu servidor, use a Tokenização no navegador
- Use Listar Cartões para verificar se o cartão foi adicionado com sucesso
- Use Excluir Cartão caso o cliente deseje remover o cartão imediatamente
- Cartões são imutáveis: para alterar dados (ex.: validade), exclua o cartão e cadastre um novo
Atualizado em 17 de outubro de 2026