Visão geral
O recurso Clientes (customer) representa as pessoas físicas ou jurídicas que compram de você ou interagem com a sua plataforma. Um cliente reúne identidade (nome, documento, e-mail, telefone), seus en
O recurso Clientes (customer) representa as pessoas físicas ou jurídicas que compram de você ou interagem com a sua plataforma. Um cliente reúne identidade (nome, documento, e-mail, telefone), seus endereços e cartões tokenizados, e serve de âncora para transações, assinaturas e relatórios. Esta página explica o modelo do objeto, o ciclo de vida e todas as operações disponíveis; cada operação tem sua própria página detalhada.
O que é um cliente
Em termos práticos, o cliente é o "cadastro" central de quem paga. Você normalmente o cria uma vez (no checkout, no onboarding ou ao importar seu CRM) e o reutiliza em cada cobrança. Guardar o id do cliente (cus_...) no seu sistema permite:
- Cobrar de novo sem repedir os dados (cartões ficam vinculados ao cliente).
- Consultar o histórico de transações daquele comprador.
- Sincronizar seu CRM via
externalReferenceemetadata.
Tokenizar significa substituir um dado sensível (como o número do cartão) por uma referência segura (um token). Os cartões aparecem no cliente apenas como
card_...com bandeira e últimos dígitos — nunca o número completo.
O recurso segue as Convenções da API: campos em camelCase, IDs opacos no formato prefixo_valor, datas em ISO 8601 UTC e dinheiro sempre em centavos (inteiro). O prefixo de um cliente é sempre cus_.
Modelo do objeto
O exemplo abaixo é a forma completa retornada por uma leitura (GET /v1/customers/{customerId}). Os comentários explicam cada bloco — repare que transactions[] só aparece na leitura.
{
"id": "cus_01hqzvabc", // ID opaco do cliente (prefixo cus_)
"firstName": "João",
"lastName": "Silva",
"email": "[email protected]",
"birthdate": "1990-05-15", // data pura YYYY-MM-DD (sem hora)
"gender": "male", // enum: male | female | other
"document": {
"type": "cpf", // enum: cpf | cnpj | passport
"number": "12345678901" // somente dígitos para cpf/cnpj
},
"telephone": {
"countryCode": "55",
"areaCode": "11",
"number": "999999999",
"line": "5511999999999" // composto pela API (read-only)
},
"available": true, // cliente ativo/utilizável
"delinquent": false, // marcado como inadimplente?
"externalReference": "CRM-98765", // sua referência no seu sistema
"additionalEmails": [ // e-mails extras (máx. 20)
"[email protected]"
],
"metadata": { // pares chave/valor livres (máx. 20)
"source": "website"
},
"geolocation": null, // pode vir null
"transactions": [ // SÓ na leitura (read) — projeção leve
{
"id": "tra_01hqzvabc",
"amount": 5000, // centavos = R$ 50,00
"originalAmount": 5000,
"status": "approved",
"method": "credit",
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"addresses": [ // endereços vinculados (ver Addresses)
{
"id": "addr_01hqzvabc",
"street": "Av. Paulista",
"number": "1000",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"postcode": "01310100",
"primary": true,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"cards": [ // cartões tokenizados (ver Cards)
{
"id": "card_01hqzvabc",
"holderName": "JOÃO SILVA",
"brand": "visa",
"firstDigits": "411111",
"lastDigits": "1111",
"fingerprint": "fp_a1b2c3d4",
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-10T09:15:25.000Z",
"merchant": { // contexto do lojão dono da chave
"name": "Seller Name",
"merchantId": "bus_1234567890",
"isSubAccount": false
},
"_links": { "self": { "href": "...", "method": "GET" } } // HATEOAS (ver abaixo)
}Campos principais
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador opaco do cliente (cus_...). Trate como string; não faça parsing. |
firstName | string | Nome. Obrigatório ao criar. |
lastName | string | Sobrenome. Obrigatório ao criar. |
email | string (email) | E-mail principal. Obrigatório ao criar. |
birthdate | string (date) | Data de nascimento no formato YYYY-MM-DD (sem hora). |
gender | string (enum) | Um de: male, female, other. |
document.type | string (enum) | Tipo do documento: cpf, cnpj ou passport. |
document.number | string | Número do documento; somente dígitos quando o tipo é cpf/cnpj. |
telephone.countryCode | string | Código do país (dígitos), ex.: 55. |
telephone.areaCode | string | Código de área (dígitos), ex.: 11. |
telephone.number | string | Número (dígitos). |
telephone.line | string | Linha completa montada pela API (read-only). Não envie na requisição. |
available | boolean | Indica se o cliente está ativo/utilizável. |
delinquent | boolean | Marca de inadimplência derivada do histórico. |
externalReference | string | Referência livre para casar com o seu sistema (ex.: ID do CRM). |
additionalEmails | array de string | E-mails secundários (máx. 20). |
metadata | object | Pares chave/valor livres (máx. 20 chaves; valores curtos, ≤256 chars). |
geolocation | object | null | Dados de geolocalização (ipAddress, country); pode vir null. |
transactions | array | Histórico resumido. Só presente na leitura (Read). |
addresses | array | Endereços do cliente. Veja Addresses. |
cards | array | Cartões tokenizados do cliente. Veja Cards. |
merchant | object | Contexto do lojista dono da SelectKey usada. |
_links | object | Links HATEOAS para as ações possíveis sobre o recurso. |
createdAt / updatedAt | string (date-time) | Carimbos ISO 8601 UTC (...Z). |
Importante
A forma da resposta varia por operação. Em Read você recebe transactions[] mais addresses[] e cards[] completos. Em Create/Update (PUT) o objeto vem completo, mas sem transactions. Em List cada item é uma projeção leve (campos achatados como documentType e telephone como string). Detalhes na seção de cada operação.
Ciclo de vida
Um cliente não tem uma máquina de estados com muitas transições; o que muda ao longo do tempo são suas flags (available, delinquent) e os recursos vinculados. O fluxo típico é:
- Criação retorna o objeto já com
available: trueedelinquent: false. - Atualização com
PUTsubstitui o conjunto de campos permitidos; comPATCHatualiza só o que você enviar. delinquenteavailablesão derivados pela plataforma (histórico de pagamentos, regras internas) — você lê esses campos, não os define manualmente.- Exclusão remove o cliente e retorna uma confirmação (
deleted: true). Avalie as implicações antes — veja a página Excluir.
Operações
| Operação | Método e caminho | Resumo |
|---|---|---|
| Criar | POST /v1/customers | Cria um cliente. Retorna objeto completo com addresses[] e cards[] (sem transactions). |
| Consultar | GET /v1/customers/{customerId} | Ficha completa, incluindo transactions[], addresses[] e cards[]. |
| Atualizar (PUT) | PUT /v1/customers/{customerId} | Substitui o conjunto de campos permitidos de uma vez. |
| Atualizar (PATCH) | PATCH /v1/customers/{customerId} | Atualização parcial — só os campos enviados. |
| Listar | GET /v1/customers | Lista paginada com busca e filtros (itens leves + merchant/_links). |
| Excluir | DELETE /v1/customers/{customerId} | Remove o cliente e retorna confirmação. |
Todas as chamadas exigem o cabeçalho de autenticação SelectKey e usam a base https://api.selectwin.io/v1.
curl https://api.selectwin.io/v1/customers/cus_01hqzvabc \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Em produção a chave começa com
sl_live_; em sandbox, comsl_test_. Nunca useAuthorization: Bearer/Basic. Veja Autenticação.
Conceitos e relações
Documentos suportados
document.type | Descrição | Conteúdo de number |
|---|---|---|
cpf | Pessoa física (Brasil) | Somente dígitos (11) |
cnpj | Pessoa jurídica (Brasil) | Somente dígitos (14) |
passport | Passaporte (estrangeiros) | Alfanumérico |
Atenção
Para cpf e cnpj, envie number somente com dígitos (sem pontos, barras ou hífen). Por exemplo, "12345678901", não "123.456.789-01".
Telefone
Você envia o telefone em partes (countryCode, areaCode, number); a API devolve essas partes e o campo composto line (read-only). Não envie line na requisição.
externalReference e metadata
São os dois mecanismos para amarrar o cliente ao seu mundo: use externalReference para o identificador único do cliente no seu sistema (ideal para deduplicação via filtro na listagem) e metadata para anotações estruturadas (máximo 20 chaves; prefira valores curtos).
HATEOAS (_links)
Cada resposta traz _links com as próximas ações possíveis (self, read, update, delete, list, create) já com href e method prontos. Em vez de montar URLs à mão, prefira seguir esses links. Veja Recursos.
Recursos relacionados
- Endereços — endereços de cobrança/entrega vinculados ao cliente (
addr_...). - Cartões — cartões tokenizados do cliente (
card_...), reutilizáveis em cobranças. - Transações — pagamentos referenciam o cliente; aparecem resumidos em
transactions[]na leitura. - Webhook Events — notificações em tempo real de mudanças. Reaja a elas em vez de fazer polling (veja Proibição de Polling).
Erros comuns do recurso
Trate sempre pelo error.code (estável), nunca pela message. Estes são os códigos específicos de Clientes; os transversais (401, 403, 422, 429, 500) valem para todos os recursos.
error.code | HTTP | Quando ocorre |
|---|---|---|
customerIdIsInvalid | 400 | O customerId informado não tem formato válido. |
customerParametersInvalid | 400 | Parâmetros do cliente inválidos (veja error.params). |
customerNotFound / customerIdNotFound | 404 | Não existe cliente com esse ID. |
customerAlreadyExists | 409 | Já existe um cliente com aquele documento/e-mail. |
customerCreateNotProcessable | 422 | Não foi possível criar o cliente (regra de negócio). |
customerReadNotProcessable | 422 | Não foi possível ler o cliente. |
customerDeleteNotProcessable | 422 | Não foi possível excluir o cliente. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para a operação. |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes. |
Catálogo completo em Códigos de Erro; estrutura do envelope em Tratamento de Erros.
Boas práticas
- Guarde o
iddo cliente (cus_...) no seu sistema e trate-o como string opaca; é a chave para cobrar de novo e consultar histórico. - Deduplique antes de criar. Antes de um
POST, filtre a listagem poremail,documentouexternalreferencepara evitarcustomerAlreadyExists(409). - Use
externalReferencepara o ID do seu CRM emetadatapara anotações — assim você correlaciona os dois sistemas sem campos paralelos. - Envie documentos só com dígitos (
cpf/cnpj) e lembre-se do tipopassportpara clientes estrangeiros. - Não dependa da forma de um endpoint em outro. Se precisa de
transactions[], faça oRead; a listagem e o create/update não trazem esse campo. - Use
X-Idempotency-Keynas criações para evitar clientes duplicados em caso de retentativa de rede (veja Idempotência). - Reaja a webhooks para saber de mudanças em vez de ficar relendo o cliente em laço.
- Resolva concorrência pelo
updatedAt. Em atualizações simultâneas, compare oupdatedAtantes de sobrescrever para não perder edições.
Veja também
How is this guide?