Atualizar um cliente
Atualize os dados de um cliente existente a partir do seu id. Use PUT quando quiser sobrescrever o conjunto de campos permitido de uma vez, ou PATCH quando quiser alterar apenas alguns campos sem reen
Atualize os dados de um cliente existente a partir do seu id. Use PUT quando quiser sobrescrever o conjunto de campos permitido de uma vez, ou PATCH quando quiser alterar apenas alguns campos sem reenviar o objeto inteiro. Útil para corrigir cadastros, enriquecer perfis e manter contato e documento sempre atualizados.
PUT /v1/customers/{customerId} · PATCH /v1/customers/{customerId}
Como funciona
A Selectwin expõe duas formas de atualizar um cliente, com o mesmo conjunto de campos editáveis:
PUT— substituição. Sobrescreve o bloco de campos permitido do cliente com o que você enviar. É a operação "estado completo": pense nela como "este passa a ser o cadastro do cliente". Por isso reenvie também os campos que não mudaram.PATCH— atualização parcial. Aplica só os campos presentes no corpo, deixando o resto intacto. Ideal para sincronizar um campo pontual (ex.: trocar o e-mail) sem precisar carregar o objeto inteiro antes.
Em ambos os casos a operação é síncrona: a resposta 200 OK já traz o cliente atualizado, com updatedAt refletindo o momento da gravação. O id, o createdAt e os relacionamentos do cliente (addresses, cards) são preservados — esta operação não cria nem remove endereços ou cartões; ela edita apenas os dados de perfil (nome, documento, contato, e-mails, metadados).
Importante
O endereço não faz parte do corpo desta requisição. Os endereços do cliente são gerenciados pelo recurso de endereços e aparecem em addresses[] na resposta apenas para leitura. Para alterar um endereço, use o recurso Endereços.
Quando usar
PATCH— para mudanças pontuais (novo telefone, novo e-mail, ajustarmetadata). É a escolha padrão na maioria das integrações, porque evita sobrescrever campos sem querer.PUT— quando o seu sistema é a fonte da verdade e você quer garantir que o cadastro fique exatamente igual ao payload enviado (sincronização "espelho" a partir do seu CRM).
Quando não usar:
- Para criar um cliente novo, use Criar cliente.
- Para ler o cadastro atual sem alterar nada, use Consultar cliente.
- Para adicionar/editar endereços, use o recurso Endereços — não este endpoint.
Dica
Antes de um PUT, busque o estado atual com Consultar cliente e reaplique sobre ele os campos que mudaram. Assim você evita apagar dados ao reenviar o objeto incompleto. Se quiser tocar só um campo, prefira PATCH.
Requisição
Headers
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
SelectKey | Sim | Sua chave de API. Produção: sl_live_...; sandbox: sl_test_.... Veja Autenticação. |
Content-Type: application/json | Sim | A requisição tem corpo JSON. |
X-Idempotency-Key | Recomendado | Torna a operação repetível com segurança caso você precise reenviar após timeout. Veja Idempotência. |
Use o header
SelectKeypara autenticar — nuncaAuthorization: BearerouBasic.
Parâmetro de caminho
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
customerId | string | Sim | ID do cliente a atualizar, no formato cus_* (ex.: cus_01hqzvabc). Trate como opaco — veja Convenções. |
Corpo da requisição
O mesmo conjunto de campos vale para PUT e PATCH. Em PUT, reenvie também os campos não alterados; em PATCH, envie só o que muda.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
firstName | string | Sim | Nome do cliente. |
lastName | string | Sim | Sobrenome do cliente. |
email | string | Sim | E-mail principal (formato de e-mail válido). |
document | object | Não | Documento de identificação (ver subcampos abaixo). |
document.type | string | — | Tipo do documento. Enum: cpf, cnpj, passport. |
document.number | string | — | Número do documento. Apenas dígitos (^\d+$) quando o tipo for cpf/cnpj. |
telephone | object | Não | Telefone de contato (ver subcampos abaixo). |
telephone.countryCode | string | — | Código do país, apenas dígitos (ex.: 55). |
telephone.areaCode | string | — | Código de área, apenas dígitos (ex.: 11). |
telephone.number | string | — | Número do telefone, apenas dígitos. |
gender | string | Não | Gênero. Enum: male, female, other. |
birthdate | string | Não | Data de nascimento no formato YYYY-MM-DD. |
additionalEmails | array<string> | Não | E-mails adicionais do cliente (máx. 20). |
externalReference | string | Não | ID de referência do seu sistema para correlacionar este cliente ao seu CRM. |
metadata | object | Não | Pares chave/valor livres (máx. 20 chaves; prefira valores de texto curtos, ≤256 caracteres). |
Atenção
Dados de cliente são sensíveis (LGPD/GDPR). Confira sempre o customerId antes de gravar para não atualizar o cadastro errado. Em PUT, lembre-se de que campos omitidos podem ser sobrescritos — use PATCH se quiser tocar só uma parte.
Exemplo — PUT (substituição)
curl -X PUT https://api.selectwin.io/v1/customers/cus_01hqzvabc \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: 4d2b1c9a-7e3f-4a10-9c8e-2f6a1b0d3e55" \
-d '{
"document": { "type": "cpf", "number": "12345678901" },
"telephone": { "countryCode": "55", "areaCode": "11", "number": "999999999" },
"firstName": "João",
"lastName": "Silva",
"email": "[email protected]",
"externalReference": "CRM-USER-001",
"gender": "male",
"birthdate": "1990-01-15",
"additionalEmails": ["[email protected]"],
"metadata": { "crmId": "lead-42" }
}'Exemplo — PATCH (atualização parcial)
Trocar apenas o e-mail e um campo de metadata:
curl -X PATCH https://api.selectwin.io/v1/customers/cus_01hqzvabc \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-d '{
"firstName": "João",
"lastName": "Silva",
"email": "[email protected]",
"metadata": { "crmId": "lead-42" }
}'
firstName,lastNameePATCH.
Resposta
Em sucesso, o status é 200 OK e o corpo é o objeto cliente atualizado, incluindo os relacionamentos em projeção leve (addresses[], cards[]) e os _links (HATEOAS) para as próximas ações.
{
"id": "cus_01hqzvabc",
"firstName": "João",
"lastName": "Silva",
"email": "[email protected]",
"birthdate": "1990-01-15",
"gender": "male",
"document": { "type": "cpf", "number": "12345678901" },
"telephone": {
"countryCode": "55",
"areaCode": "11",
"number": "999999999",
"line": "5511999999999"
},
"geolocation": null,
"available": true,
"delinquent": false,
"externalReference": "CRM-USER-001",
"additionalEmails": ["[email protected]"],
"addresses": [
{
"id": "addr_01hqzvabc",
"street": "Av. Paulista",
"number": "1000",
"complement": "Sala 1",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"postcode": "01310100",
"line": "Av. Paulista, 1000 - Bela Vista, São Paulo - SP, 01310100",
"primary": true,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"cards": [],
"metadata": { "crmId": "lead-42" },
"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/customers/cus_01hqzvabc",
"method": "GET",
"description": "Read a customer."
},
"delete": {
"href": "https://api.selectwin.io/v1/customers/cus_01hqzvabc",
"method": "DELETE",
"description": "Delete the customer."
},
"list": {
"href": "https://api.selectwin.io/v1/customers",
"method": "GET",
"description": "List all customers."
}
}
}Campos-chave da resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador do cliente (cus_*). |
firstName / lastName / email | string | Dados básicos atualizados. |
document | object | type (cpf/cnpj/passport) e number. |
telephone | object | countryCode, areaCode, number e line (número completo derivado). |
geolocation | object | null | Geolocalização capturada, quando houver. |
available | boolean | Indica se o cliente está ativo/disponível. |
delinquent | boolean | Indica inadimplência. |
externalReference | string | Sua referência externa. |
additionalEmails | array | E-mails adicionais. |
addresses | array | Endereços vinculados (projeção leve, somente leitura aqui). |
cards | array | Cartões tokenizados do cliente (projeção leve). |
metadata | object | Metadados livres. |
createdAt / updatedAt | string (ISO 8601 UTC) | Criação e última atualização. updatedAt muda a cada gravação. |
merchant | object | Conta dona do cliente (name, merchantId, isSubAccount). |
_links | object | Links HATEOAS para self, delete e list. |
Nota
A resposta de PUT traz o endereço expandido (com primary, line, etc.), enquanto a de PATCH pode trazer a projeção mais enxuta (addresses[].default). Não dependa da presença de campos opcionais individuais — leia o que vier e, se precisar do objeto completo, faça um Consultar cliente.
Erros
Trate sempre pelo error.code (estável), não pela message. Veja o envelope em Tratamento de Erros e a lista completa em Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
customerIdIsInvalid | 400 | O customerId informado não tem formato válido. |
invalidParameters / customerParametersInvalid | 400 | Falha de validação de campos do corpo (veja error.params). |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticada, mas sem permissão para o recurso. |
customerNotFound / customerIdNotFound | 404 | Não existe cliente com esse id. |
customerAlreadyExists | 409 | Conflito de unicidade (ex.: e-mail/documento já usado por outro cliente). |
unprocessableEntity | 422 | Entidade não processável por regra de negócio. |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes. |
serverError | 500 | Erro interno. Repita com backoff. |
Exemplo de erro de validação (400):
{
"error": {
"code": "invalidParameters",
"statusCode": 400,
"category": "validation",
"message": "Validation errors occurred.",
"params": [
{ "firstName": "The firstName field must be between 3 and 40 characters." }
]
}
}Boas práticas
- Prefira
PATCHpara mudanças pontuais. Ele só mexe nos campos enviados e evita apagar dados sem querer; reservePUTpara sincronizações de espelho onde o seu sistema é a fonte da verdade. - Leia antes de um
PUT. Busque o estado atual com Consultar cliente, aplique suas mudanças e reenvie o objeto completo — assim nenhum campo se perde. - Não tente atualizar endereço por aqui. O
addressnão faz parte do corpo; gerencie endereços pelo recurso Endereços. - Normalize os documentos e telefones.
document.numbere os campos detelephoneaceitam apenas dígitos (sem pontos, traços ou parênteses) paracpf/cnpj. - Envie
X-Idempotency-Keyse houver risco de reenvio (timeout, retry automático), garantindo que a mesma atualização não seja aplicada de formas conflitantes. Veja Idempotência. - Use
externalReferenceemetadatapara casar o cliente com o registro equivalente no seu CRM e facilitar conciliação. - Trate o
idcomo opaco e confie no campoidda resposta, não no formato do prefixo. Veja Convenções. - Reaja por estados, não por polling. Para acompanhar mudanças de cliente em escala, prefira webhooks a varredura periódica.
Veja também
- Visão geral de Clientes
- Criar cliente
- Consultar cliente
- Listar clientes
- Excluir cliente
- Endereços — para gerenciar os endereços do cliente
- Convenções da API · Códigos de Erro · Idempotência
How is this guide?