Listar produtos
Liste os produtos do seu catálogo com filtros (slug, categoria, nome, idioma, datas) e paginação. Use a lista paginada no dia a dia — para alimentar tabelas, telas administrativas ou buscas — e a list
Liste os produtos do seu catálogo com filtros (slug, categoria, nome, idioma, datas) e paginação. Use a lista paginada no dia a dia — para alimentar tabelas, telas administrativas ou buscas — e a lista completa (listall) quando precisar puxar o catálogo inteiro de uma vez, por exemplo para popular um seletor ou um cache local.
A API oferece duas formas de listar produtos, com formatos de resposta diferentes:
| Endpoint | Formato | Quando usar |
|---|---|---|
GET /v1/products | paginado (envelope com data[]) | Listagens com paginação, filtros e navegação por páginas |
GET /v1/products/listall | array direto (sem envelope) | Carregar muitos/todos os produtos de uma vez (ex.: selects, exportações) |
Ambos retornam uma projeção leve de cada produto (campos resumidos). Para o objeto completo — com variants, description, warrantyDays, etc. — use Consultar.
Como funciona
Os dois endpoints percorrem o mesmo catálogo e aceitam os mesmos filtros; a diferença está no formato da resposta e no teto de itens:
GET /v1/productsdevolve um objeto paginado no nível raiz:offset,limit,total,hasMore,page(metadados de navegação) edata(o array de produtos). Olimitvai de 1 a 100. É a forma recomendada para a maioria dos casos.GET /v1/products/listalldevolve um array diretamente no nível raiz — semoffset/limit/total/data/page. Aceita umlimitmuito maior (até 999999), pensado para trazer o catálogo quase inteiro numa chamada só.
A lista paginada de produtos não inclui os blocos
merchantnem_links(HATEOAS) que aparecem em outras listagens. E olistall, por ser um array puro, também não os inclui. Veja o padrão geral em Paginação.
Os filtros são aplicados pelo servidor antes da paginação, então total reflete a contagem após os filtros. Combine filtros (ex.: category + enabled) para refinar o resultado.
Quando usar (e quando NÃO usar)
- Use
GET /v1/productspara telas com paginação, busca por nome/slug, ou qualquer fluxo em que você navega página a página. É a opção segura para catálogos grandes. - Use
GET /v1/products/listallquando o catálogo é pequeno/médio e você precisa de tudo de uma vez (popular um<select>, sincronizar um cache, gerar um relatório simples). Evite-o em catálogos enormes: prefira a lista paginada para não trafegar megabytes numa só resposta. - Para um produto específico com todos os detalhes (incluindo variantes), não liste — use Consultar.
- Para listar variantes, veja Variantes.
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_. Nunca use Authorization: Bearer/Basic. Veja Autenticação. |
Listagens são apenas leitura (
GET) e não usam corpo nemX-Idempotency-Key.
Parâmetros de query
Os dois endpoints aceitam os mesmos filtros. A única diferença é o teto de limit.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
limit | number | Não | Máximo de itens por página. Em GET /v1/products: 1..100. Em listall: 1..999999. |
offset | number | Não | Quantos itens pular (≥ 0). Use para navegar entre páginas. |
sort | string | Não | Ordem dos resultados. Enum: ascending, descending. |
id | string | Não | Filtra por ID do produto. Deve seguir o padrão prefixo_valor (ex.: prd_01hqzvabc). |
slug | string | Não | Filtra pelo slug (ex.: plano-premium). |
name | string | Não | Busca por nome (ex.: Premium). |
language | string | Não | Filtra por código de idioma (ex.: pt). |
category | string | Não | Filtra por categoria (ex.: courses). |
enabled | boolean | Não | Filtra por produtos ativos (true) ou inativos (false). |
externalreference | string | Não | Filtra pela sua referência externa (ex.: SKU-EXT-1). |
daterange | string | Não | Filtra por um único dia de calendário; a API expande para o início e o fim daquele dia. ISO 8601 UTC. |
daterangegt | string | Não | Limite inferior exclusivo: registros estritamente após a data. ISO 8601 UTC. |
daterangegte | string | Não | Limite inferior inclusivo: registros a partir da data (inclusive). ISO 8601 UTC. |
daterangelt | string | Não | Limite superior exclusivo: registros estritamente antes da data. ISO 8601 UTC. |
daterangelte | string | Não | Limite superior inclusivo: registros até a data (inclusive). ISO 8601 UTC. |
Nota
O parâmetro é externalreference (tudo minúsculo) na query de filtro, embora o campo no corpo e nas respostas seja externalReference (camelCase). Datas seguem ISO 8601 UTC (sufixo Z).
Lista paginada
GET /v1/products
curl -X GET "https://api.selectwin.io/v1/products?limit=20&offset=0&enabled=true&sort=descending" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Filtrando por categoria e nome:
curl -X GET "https://api.selectwin.io/v1/products?category=saas&name=Premium" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Resposta (200)
{
"offset": 0,
"limit": 20,
"total": 5,
"hasMore": false,
"page": {
"current": 1,
"total": 1,
"offset": { "first": 0, "prev": null, "next": null, "last": 0 }
},
"data": [
{
"id": "prd_01hqzvabc",
"name": "Plano Premium",
"slug": "plano-premium",
"salesPage": "https://example.com/sales",
"category": "saas",
"salesQty": 42,
"language": "pt-BR",
"enabled": true,
"images": ["https://example.com/img1.png"],
"type": "digital",
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
]
}Campos do envelope de paginação:
| Campo | Tipo | Descrição |
|---|---|---|
offset | integer | Posição inicial dos resultados na coleção completa. |
limit | integer | Limite aplicado nesta página. |
total | integer | Total de produtos que casam com os filtros. |
hasMore | boolean | true se há mais 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 para navegação (prev/next são null nos extremos). |
data | array | Produtos (projeção leve — veja abaixo). |
Campos de cada item em data[] (projeção leve):
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID do produto (prd_...). Trate como opaco. |
name | string | Nome do produto. |
slug | string | Identificador amigável para URL. |
salesPage | string | URL da página de vendas. |
category | string | Categoria do produto. |
salesQty | integer | Quantidade de vendas acumuladas. |
language | string | Código de idioma. |
enabled | boolean | Se o produto está ativo. |
images | array | URLs de imagens. |
type | string | Tipo do produto (physical, digital ou other). |
updatedAt | string | Data-hora da última atualização (ISO 8601 UTC). |
createdAt | string | Data-hora de criação (ISO 8601 UTC). |
Importante
Os itens de data[] são uma projeção leve: não trazem variants, description, warrantyDays nem externalReference. Para o objeto completo, use Consultar.
Lista completa (array direto)
GET /v1/products/listall
Retorna um array com os produtos, sem envelope de paginação. Aceita os mesmos filtros e ordenação, com limit de até 999999.
curl -X GET "https://api.selectwin.io/v1/products/listall?enabled=true&sort=ascending" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Resposta (200)
[
{
"id": "prd_01hqzvabc",
"name": "Plano Premium",
"slug": "plano-premium",
"images": ["https://example.com/img1.png"],
"salesPage": "https://example.com/sales",
"salesQty": 42,
"language": "pt-BR",
"enabled": true,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
]Campos de cada item:
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID do produto (prd_...). |
name | string | Nome do produto. |
slug | string | Identificador amigável para URL. |
images | array | URLs de imagens. |
salesPage | string | URL da página de vendas. |
salesQty | integer | Quantidade de vendas acumuladas. |
language | string | Código de idioma. |
enabled | boolean | Se o produto está ativo. |
updatedAt | string | Última atualização (ISO 8601 UTC). |
createdAt | string | Criação (ISO 8601 UTC). |
Nota
O listall é sempre um array no nível raiz — não há offset/limit/total/data/page. Diferente da lista paginada, esta projeção não inclui category nem type. Para esses campos, use a lista paginada ou Consultar.
Erros
A API sinaliza falhas pelo error.code estável (não pela message). Para a estrutura do envelope de erro, veja Tratamento de Erros; para a lista completa, o Catálogo de Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
productIdIsInvalid | 400 | Filtro id malformado ou que não casa com nenhum produto. |
invalidParameters | 400 | Parâmetro de query inválido (ex.: limit fora de 1..100, sort fora do enum). Veja error.params para o campo. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para o recurso. |
unprocessableEntity | 422 | Combinação de filtros não processável. |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes e faça backoff. |
serverError | 500 | Erro interno — tente novamente; se persistir, contate o suporte. |
Boas práticas
- Itere com
page.offset.next/hasMore. Avance enquantohasMorefortrue, usando ooffsetsugerido empage.offset.nextem vez de calcular offsets na mão. - Escolha o endpoint certo pelo volume. Catálogo pequeno e precisa de tudo:
listall. Catálogo grande ou paginação na tela:GET /v1/productscomlimit≤ 100. - Filtre no servidor, não no cliente. Use
category,enabled,name,sluge osdaterange*para reduzir a resposta — é mais rápido e poupa rate limit. - Trate os IDs como opacos. Armazene a string
idinteira; não faça parsing do prefixoprd_. Veja Convenções. - Não confie na projeção leve para detalhes. Se precisar de
variants,descriptionouwarrantyDays, busque o produto com Consultar. - Respeite o rate limit ao varrer páginas. Em loops longos, adicione um pequeno intervalo entre as requisições e trate
tooManyRequestscom backoff. - Use
externalreferencepara correlacionar. Filtrar pela referência do seu sistema evita guardar o mapeamento de IDs internos.
Veja também
- Visão geral de Produtos — modelo do objeto e todas as operações
- Consultar produto — objeto completo com variantes
- Criar produto e Atualizar produto
- Variantes — listar e gerenciar variantes
- Paginação · Convenções · Autenticação
How is this guide?