Listar endereços
Recupere uma lista paginada de endereços cadastrados, com filtros por cliente e por intervalo de datas. Use para montar telas de seleção de endereço no checkout, exibir os endereços de um cliente no p
Recupere uma lista paginada de endereços cadastrados, com filtros por cliente e por intervalo de datas. Use para montar telas de seleção de endereço no checkout, exibir os endereços de um cliente no perfil ou sincronizar cadastros com o seu CRM/ERP.
GET /v1/addresses
Como funciona
Este endpoint retorna uma coleção paginada de endereços que pertencem à sua conta (merchant). Em vez de devolver tudo de uma vez, a API entrega os resultados em "páginas": você controla quantos itens vêm por vez (limit) e a partir de qual posição começar (offset).
Alguns pontos importantes sobre o comportamento:
- Projeção leve. Cada item dentro de
data[]é uma projeção de listagem — uma versão enxuta do endereço, otimizada para listas. Ela já traz os campos principais (logradouro, cidade, CEP, etc.), mas para a representação individual completa (com os links de navegação de cada recurso) consulte Consultar endereço viaGET /v1/addresses/{addressId}. - Somente leitura. É uma operação
GET, portanto segura e sem efeitos colaterais: pode ser repetida à vontade, não altera nada e não precisa de chave de idempotência. - Metadados de paginação no nível raiz. O corpo da resposta é o próprio objeto paginado (
offset,limit,total,hasMore,page,data,merchant,_links). Para entender esse envelope em detalhe, veja Paginação.
O fluxo típico de iterar por todas as páginas:
Quando usar (e quando não usar)
Use Listar quando você precisa descobrir ou percorrer vários endereços: popular um seletor de endereços, montar um painel administrativo, ou exportar cadastros em lote.
Quando não usar:
- Se você já tem o
addr_*de um endereço específico e quer todos os detalhes, vá direto em Consultar endereço — é mais rápido e mais barato do que listar e filtrar no cliente. - Para criar, alterar ou remover endereços, use Criar, Atualizar e Excluir.
Nota
Não fique chamando este endpoint em loop para "vigiar" mudanças (polling). Para reagir a eventos em tempo real, use webhooks — veja Proibição de polling.
Requisição
Headers
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
SelectKey | Sim | Sua chave de API. Em produção começa com sl_live_; em sandbox, com sl_test_. Veja Autenticação. |
Por ser um GET sem corpo, não há Content-Type nem X-Idempotency-Key.
A autenticação é sempre pelo header
SelectKey— nuncaAuthorization: BearerouBasic.
Parâmetros de query
Todos os parâmetros abaixo são opcionais. Sem nenhum filtro, o endpoint retorna a primeira página de todos os endereços da sua conta.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
limit | integer | Não | Número máximo de itens por página. Intervalo: 1–100. Padrão: 10. |
offset | integer | Não | Quantos itens pular antes de começar a retornar (base 0). Padrão: 0. |
sort | string | Não | Ordem dos resultados. Valores: ascending ou descending. Padrão: descending (mais recentes primeiro). |
customerid | string | Não | Filtra os endereços de um cliente específico. Deve seguir o padrão prefixo_valor, ex.: cus_01hqzvabc. |
daterangegte | string (ISO 8601) | Não | Limite inferior inclusivo: inclui apenas registros criados em ou após este instante. |
daterangegt | string (ISO 8601) | Não | Limite inferior exclusivo: inclui apenas registros criados estritamente após este instante. |
daterangelte | string (ISO 8601) | Não | Limite superior inclusivo: inclui apenas registros criados em ou antes deste instante. |
daterangelt | string (ISO 8601) | Não | Limite superior exclusivo: inclui apenas registros criados estritamente antes deste instante. |
daterange | string (ISO 8601) | Não | Filtro de data exato (legado). Prefira os pares daterangegte/daterangelt para faixas. |
Importante
O nome do parâmetro de filtro por cliente é customerid (tudo minúsculo) na query string deste endpoint — uma exceção ao padrão camelCase usado nos corpos JSON. Use exatamente essa grafia, senão o filtro é ignorado.
Dica
Datas seguem ISO 8601 em UTC (sufixo Z), ex.: 2026-04-12T17:56:33.000Z. Para "todos os endereços criados em abril de 2026", combine daterangegte=2026-04-01T00:00:00Z com daterangelt=2026-05-01T00:00:00Z (limite inferior inclusivo, superior exclusivo — evita sobreposição entre meses).
Exemplo de requisição
Primeira página de 25 endereços de um cliente, dos mais recentes para os mais antigos:
curl -G https://api.selectwin.io/v1/addresses \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
--data-urlencode "customerid=cus_01hqzvabc" \
--data-urlencode "limit=25" \
--data-urlencode "offset=0" \
--data-urlencode "sort=descending"Endereços criados em uma janela de datas, sem filtrar por cliente:
curl -G https://api.selectwin.io/v1/addresses \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
--data-urlencode "daterangegte=2026-04-01T00:00:00Z" \
--data-urlencode "daterangelt=2026-05-01T00:00:00Z" \
--data-urlencode "limit=100"
curl -Gcom--data-urlencodemonta a query string com escape correto — útil para valores com:(datas) ou caracteres especiais.
Resposta
Em caso de sucesso, o servidor retorna 200 OK com o objeto paginado. O array data contém as projeções leves de cada endereço.
{
"offset": 0,
"limit": 25,
"total": 42,
"page": {
"offset": { "first": 0, "prev": null, "next": 25, "last": 25 },
"current": 1,
"total": 2
},
"data": [
{
"id": "addr_01hqzvabc",
"street": "Av. Paulista",
"number": "1000",
"complement": "Sala 1",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"postcode": "01310100",
"latitude": null,
"longitude": null,
"lineAddress": "Av. Paulista, 1000 - Bela Vista, São Paulo - SP, 01310100",
"metadata": null,
"primary": true,
"ownerType": "customer",
"ownerId": "cus_01hqzvabc",
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"hasMore": true,
"merchant": {
"name": "Seller Name",
"merchantId": "bus_1234567890",
"isSubAccount": false
},
"_links": {
"self": {
"href": "https://api.selectwin.io/v1/addresses",
"method": "GET",
"description": "List all addresses."
},
"create": {
"href": "https://api.selectwin.io/v1/addresses",
"method": "POST",
"description": "Create a new address."
}
}
}Campos de paginação (raiz da resposta)
| Campo | Tipo | Descrição |
|---|---|---|
offset | integer | Posição inicial dos resultados nesta página. |
limit | integer | Máximo de itens retornados por página. |
total | integer | Total de endereços disponíveis para a consulta (com os filtros aplicados). |
hasMore | boolean | true se ainda há resultados além desta página. |
page.current | integer | Número da página atual (começa em 1). |
page.total | integer | Total de páginas. |
page.offset.first / prev / next / last | integer | null | Offsets prontos para navegação. prev/next são null nos extremos. |
data | array | Projeções leves de endereço (ver abaixo). |
merchant | object | Conta dona dos resultados (name, merchantId, isSubAccount). |
_links | object | Links HATEOAS da coleção (self, create). |
Campos de cada endereço em data[]
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador público do endereço (addr_*). Trate como opaco. |
street | string | Logradouro (rua/avenida). |
number | string | Número. |
complement | string | null | Complemento (ex.: sala, apto). |
district | string | Bairro/distrito. |
city | string | Cidade. |
state | string | Estado/UF. |
country | string | País em código ISO 3166-1 (ex.: BR). |
postcode | string | CEP/código postal. |
latitude | number | null | Latitude, quando disponível. |
longitude | number | null | Longitude, quando disponível. |
lineAddress | string | Endereço formatado em uma linha, pronto para exibição. |
metadata | object | null | Objeto livre de chave/valor que você anexa ao recurso. Veja Metadata. |
primary | boolean | true se for o endereço principal do dono. |
ownerType | string | Tipo do dono (ex.: customer). |
ownerId | string | ID do dono (ex.: cus_*). |
createdAt | string (date-time) | Criação, em ISO 8601 UTC. |
updatedAt | string (date-time) | Última atualização, em ISO 8601 UTC. |
Como percorrer todas as páginas
- Comece com
offset=0e umlimit(ex.: 25 ou 100). - Processe os itens de
data. - Se
hasMorefortrue, faça a próxima chamada usandopage.offset.nextcomo novooffset. - Pare quando
hasMoreforfalse.
Prefira sempre os valores de page.offset.* da própria resposta a recalcular offsets na mão — assim seu código continua correto mesmo se o limit efetivo mudar.
Erros
O envelope de erro traz um error.code estável (use-o para tratar erros — nunca a message). Veja a estrutura em Tratamento de Erros.
error.code | HTTP | Quando ocorre |
|---|---|---|
invalidParameters | 400 | Parâmetro de query inválido (ex.: limit fora de 1..100, sort diferente de ascending/descending, data malformada). Detalhes em error.params. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para acessar estes recursos. |
unprocessableEntity | 422 | A requisição não pôde ser processada por uma regra de negócio. |
tooManyRequests | 429 | Limite de requisições excedido. Respeite error.retryAfterMinutes e use backoff. Veja API Limits. |
serverError | 500 | Erro interno inesperado. Tente novamente com backoff; se persistir, contate o suporte. |
Exemplo de 400 por parâmetro inválido:
{
"error": {
"code": "invalidParameters",
"statusCode": 400,
"category": "validation",
"message": "Validation errors occurred.",
"params": [
{ "limit": "limit must be between 1 and 100" }
]
}
}Atenção
Uma consulta que simplesmente não encontra endereços não é um erro: você recebe 200 OK com data: [], total: 0 e hasMore: false. Trate a lista vazia na sua interface — não confunda com 404. O código addressIdNotFound (404) aparece em operações por ID (Read/Update/Delete), não na listagem.
Boas práticas
- Filtre no servidor, não no cliente. Passe
customeride os filtros de data na query em vez de baixar tudo e filtrar localmente — menos tráfego e menos chamadas contra o seu rate limit. - Escolha um
limitadequado. Para seletores de endereço no checkout,limit=10costuma bastar. Para sincronização/exportação, uselimit=100e itere compage.offset.nextpara minimizar o número de chamadas. - Navegue por
page.offset.*. Use os offsets que a resposta entrega em vez de calcular offsets manualmente. - Datas sempre em UTC com
Z. Monte faixas com limite inferior inclusivo (daterangegte) e superior exclusivo (daterangelt) para não duplicar registros nas bordas. - Trate
data: []. Mostre um estado vazio amigável e, se fizer sentido, ofereça o fluxo de Criar endereço. - Respeite o rate limit. Ao percorrer muitas páginas, espace as chamadas; em
429, faça backoff conformeerror.retryAfterMinutes. - IDs são opacos. Guarde o
id(addr_*) inteiro; não faça parsing nem deduza nada do prefixo. Veja Convenções.
Veja também
- Visão geral de Endereços — o modelo do objeto e o ciclo de vida.
- Criar endereço · Consultar endereço · Atualizar endereço · Excluir endereço
- Paginação — o envelope
offset/limit/page/hasMoreem detalhe. - Convenções · Autenticação · Catálogo de Códigos de Erro
How is this guide?