SelectwinDOCS
Clientes

Listar clientes

Recupera uma coleção paginada de clientes cadastrados na sua conta, com busca, filtros e ordenação. É o ponto de partida para telas administrativas, sincronização de CRM, relatórios e para encontrar o

Recupera uma coleção paginada de clientes cadastrados na sua conta, com busca, filtros e ordenação. É o ponto de partida para telas administrativas, sincronização de CRM, relatórios e para encontrar o id de um cliente quando você só conhece o e-mail, o documento ou a sua referência externa.

GET /v1/customers

Como funciona

O endpoint devolve um objeto paginado: em vez de despejar todos os clientes de uma vez, a API retorna uma "fatia" controlada por limit (tamanho da página) e offset (quantos registros pular). Junto vêm metadados de navegação (total, hasMore, page) e links HATEOAS (_links) para a próxima ação possível.

Pontos importantes do mecanismo:

  • Projeção leve. Cada item em data[] é uma versão resumida do cliente — só os campos mais usados para listar (nome, e-mail, documento, telefone, situação e timestamps). Campos pesados como endereços, cartões e transações não vêm na listagem. Para a ficha completa, use Consultar cliente com o id retornado aqui.
  • Filtros combinam com E (AND). Se você enviar email e document ao mesmo tempo, só voltam clientes que casem com ambos.
  • Filtros de data. A família daterange* filtra pelo campo de data do cliente (data de cadastro). daterange isola um único dia; os sufixos gt/gte/lt/lte definem limites inferiores/superiores, exclusivos ou inclusivos.
  • Operação somente-leitura. Listar não altera nada, não consome idempotência e pode ser repetida à vontade (respeitando os limites de uso).

Quando usar (e quando não)

Use para encontrar clientes por critério (e-mail, documento, nome, referência externa), para alimentar listagens administrativas e para sincronização incremental por intervalo de datas.

Evite usar a listagem como banco de dados espelho: percorrer toda a base página a página em tempo real é caro e lento. Se você já tem o id, vá direto em Consultar cliente. Se você sincroniza um sistema externo, prefira filtrar por daterangegte a partir do último ponto sincronizado, em vez de varrer tudo.

Nota

Mudanças de estado dos recursos devem chegar até você por webhooks, não por varredura repetida desta lista. Veja a Proibição de polling.

Requisição

Headers

Resumo das Convenções:

CabeçalhoUso
SelectKeyObrigatório — sua chave de API. Produção começa com sl_live_; sandbox com sl_test_. Veja Autenticação.

Não há corpo de requisição neste endpoint, então Content-Type é dispensável.

Atenção

A autenticação é sempre pelo header SelectKey. Nunca use Authorization: Bearer ou Basic — não são aceitos.

Parâmetros de consulta (query)

Todos opcionais. Sem filtros, a API retorna a primeira página de todos os clientes.

ParâmetroTipoDescriçãoExemplo
limitinteger (1–100)Quantidade máxima de itens na página.20
offsetinteger (≥ 0)Quantos registros pular antes de começar a página.0
sortstring (ascending | descending)Ordem dos resultados.descending
idstring (^[a-z]+_[A-Za-z0-9]+$)Filtra por um id de cliente específico.cus_01hqzvabc
emailstringFiltra pelo e-mail do cliente.[email protected]
namestringBusca pelo nome (parcial).João
telephonelinestring (apenas dígitos)Filtra pela linha de telefone, só números, sem formatação.11999999999
documentstring (apenas dígitos)Filtra pelo número do documento, só dígitos.12345678901
externalreferencestringFiltra pela sua referência externa (externalReference).CRM-REF-1
daterangestring (ISO 8601)Isola um único dia: a API expande o valor para o início e o fim daquele dia.2026-01-01T00:00:00Z
daterangegtstring (ISO 8601)Limite inferior exclusivo: somente registros estritamente após o valor.2026-01-01T00:00:00Z
daterangegtestring (ISO 8601)Limite inferior inclusivo: registros no valor ou depois dele.2026-01-01T00:00:00Z
daterangeltstring (ISO 8601)Limite superior exclusivo: registros estritamente antes do valor.2026-01-01T00:00:00Z
daterangeltestring (ISO 8601)Limite superior inclusivo: registros no valor ou antes dele.2026-01-01T00:00:00Z

Os nomes de filtro são minúsculos sem separador (telephoneline, externalreference), mesmo que o campo correspondente no objeto seja camelCase (telephone.line, externalReference).

Exemplos curl

Primeira página, 20 itens, mais recentes primeiro:

curl "https://api.selectwin.io/v1/customers?limit=20&offset=0&sort=descending" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

Buscar por documento (encontrar o id a partir do CPF):

curl "https://api.selectwin.io/v1/customers?document=12345678901" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

Sincronização incremental: clientes cadastrados a partir de uma data:

curl "https://api.selectwin.io/v1/customers?daterangegte=2026-04-01T00:00:00Z&limit=100" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

Resposta

200 OK — objeto paginado. Cada item em data[] é uma projeção leve do cliente.

{
  "offset": 0,
  "limit": 20,
  "total": 142,
  "hasMore": true,
  "page": {
    "current": 1,
    "total": 8,
    "offset": { "first": 0, "prev": null, "next": 20, "last": 140 }
  },
  "data": [
    {
      "id": "cus_01hqzvabc",
      "firstName": "João",
      "lastName": "Silva",
      "document": "12345678900",
      "documentType": "cpf",
      "email": "[email protected]",
      "telephone": "5511987654321",
      "delinquent": false,
      "available": 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/customers",
      "method": "GET",
      "description": "List all customers."
    },
    "create": {
      "href": "https://api.selectwin.io/v1/customers",
      "method": "POST",
      "description": "Create a new customer."
    }
  }
}

Campos da página

CampoTipoDescrição
offsetintegerPosição inicial usada nesta resposta.
limitintegerTamanho máximo da página aplicado.
totalintegerTotal de registros que casam com os filtros.
hasMorebooleantrue se ainda existem registros além desta página.
page.currentintegerNúmero da página atual.
page.totalintegerTotal de páginas para os filtros atuais.
page.offset.first / .prev / .next / .lastinteger | nullOffsets prontos para navegar (prev/next podem ser null nos extremos).
dataarrayClientes em projeção leve (campos abaixo).
merchantobjectIdentificação da conta (name, merchantId, isSubAccount).
_linksobjectLinks HATEOAS (self, create). Veja Recursos.

Campos de cada item em data[]

CampoTipoDescrição
idstringIdentificador opaco do cliente (cus_…). Use-o nos demais endpoints.
firstNamestringNome.
lastNamestringSobrenome.
documentstringNúmero do documento (somente dígitos).
documentTypestringTipo do documento (cpf, cnpj ou passport).
emailstringE-mail principal.
telephonestringLinha de telefone completa (código do país + DDD + número).
delinquentbooleanIndica se o cliente está marcado como inadimplente.
availablebooleanIndica se o cadastro está ativo/disponível.
createdAtstringData de criação, ISO 8601 UTC.
updatedAtstringData da última atualização, ISO 8601 UTC.

Importante

Na listagem, document vem como string (só o número) e o tipo fica em documentType separado. Já na ficha completa (Read) o documento aparece como objeto aninhado (document.type, document.number). Endereços, cartões e transações não vêm na listagem — busque a ficha individual para tê-los.

Como paginar

  1. Comece com offset=0 e um limit (ex.: 100).
  2. Processe data[].
  3. Se hasMore for true, faça offset += limit e repita; ou use page.offset.next diretamente.
  4. Pare quando hasMore for false.

Detalhes e exemplos em Paginação.

Erros

A resposta de erro usa o envelope padrão com error.code estável — trate sempre pelo code, nunca pela message. Veja Tratamento de erros e o Catálogo de códigos de erro.

error.codeHTTPQuando ocorre
invalidParameters400Parâmetro de query inválido (ex.: limit fora de 1–100, sort desconhecido, data malformada). Veja error.params.
customerIdIsInvalid400Valor de id fora do formato esperado de ID de cliente.
customerParametersInvalid400Combinação de filtros inválida para a busca de clientes.
unauthorized401SelectKey ausente, inválida ou revogada.
forbidden403Autenticado, mas sem permissão para listar clientes.
customerReadNotProcessable422A consulta não pôde ser processada por regra de negócio.
tooManyRequests429Limite de requisições excedido — respeite error.retryAfterMinutes e use backoff.
serverError500Erro interno — tente novamente; se persistir, contate o suporte.

Exemplo de 400 por limit inválido:

{
  "error": {
    "code": "invalidParameters",
    "statusCode": 400,
    "category": "validation",
    "message": "Validation errors occurred.",
    "params": [{ "limit": "limit must be an integer between 1 and 100" }]
  }
}

Boas práticas

  • Filtre antes de paginar. Em bases grandes, sempre restrinja com email, document, externalreference ou um intervalo de datas — varrer tudo é lento e custa cota de requisições.
  • Use daterangegte para sincronizar. Guarde o updatedAt/createdAt mais recente já processado e, na próxima rodada, filtre a partir dele, em vez de reler a coleção inteira.
  • Trate data[] como resumo. Não tente extrair endereço, cartões ou transações daqui; busque a ficha individual em Read quando precisar dos detalhes.
  • IDs são opacos. Armazene a string id inteira; não interprete o prefixo nem o comprimento. Veja Convenções.
  • Pagine com hasMore/page.offset.next, não com cálculos próprios de "última página".
  • Respeite os limites de uso. Em 429, aplique backoff honrando error.retryAfterMinutes (veja API Limits).
  • Datas em UTC. Envie os filtros daterange* em ISO 8601 com sufixo Z; converta para o fuso do usuário só na exibição.

Veja também

How is this guide?

On this page