Criar um cartão
Este endpoint permite registrar um novo cartão de crédito ou débito de forma segura, possibilitando armazenar os dados para uso em transações futuras, mediante autorização do titular.
Visão Geral
Este endpoint permite registrar um novo cartão de crédito ou débito de forma segura, possibilitando armazenar os dados para uso em transações futuras, mediante autorização do titular.
Precauções
ATENÇÃO! Por favor, leia estas informações importantes antes de usar este endpoint.
- 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 armazenados de forma segura para uso em transações futuras.
Requisição
POST /v1/cardsEste endpoint recebe dados completos do cartão (PAN + CVV). Os dados sensíveis (número e código de segurança) são tokenizados e nunca persistidos — apenas os primeiros (BIN) e últimos dígitos são armazenados. Para cobrar usando um cartão já salvo, informe o
iddo cartão no corpo da transação/assinatura (não neste endpoint).
Corpo da Requisição
{
"numbering": "4111111111111111",
"holderName": "João Silva",
"expirationMonth": 12,
"expirationYear": 2025,
"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" |
holderName | string | Sim | Nome completo do titular (3 a 255 caracteres) | "João Silva" |
numbering | string | Sim | Número completo do cartão (validado por Luhn) | "4111111111111111" |
expirationMonth | integer | Sim | Mês de validade (1 a 12) | 12 |
expirationYear | integer | Sim | Ano de validade. Aceita 4 dígitos (2025) ou 2 dígitos (25 → 2025). Não pode estar no passado | 2025 |
securityCode | string | Sim | Código de segurança / CVV (3 ou 4 dígitos). Nunca é persistido nem retornado | "123" |
primary | boolean | Não | Define se este é o cartão principal do cliente. Quando omitido, assume true | true |
Observações:
expirationMonth/expirationYearaceitam números ou strings numéricas. A combinação mês/ano deve ser futura, caso contrário a requisição é rejeitada comcardExpired.- O campo é
primary(nãoisPrimary).- Não há campo
metadataneste recurso.
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": "2025",
"primary": true,
"active": true,
"valid": true,
"verified": false,
"associated": true,
"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) |
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.: "2025") |
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 | Associado a um cliente (true na criação) |
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 |
| 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
- 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
How is this guide?