Consultar um produto
Busca um produto do catálogo pelo seu ID e devolve a representação completa, incluindo todas as variantes embutidas com seus preços (pricing). Use quando precisar exibir o produto num checkout, painel
Busca um produto do catálogo pelo seu ID e devolve a representação completa, incluindo todas as variantes embutidas com seus preços (pricing). Use quando precisar exibir o produto num checkout, painel administrativo ou integração, ou simplesmente confirmar como ele está configurado.
GET /v1/products/{productId}
Como funciona
A leitura é uma operação somente de leitura (idempotente, sem efeitos colaterais): você informa o productId no caminho da URL e a API devolve o objeto inteiro daquele produto. Diferente de uma listagem — que retorna uma projeção leve de cada item —, a leitura individual entrega a representação completa, com campos que não aparecem na lista.
O que vem embutido:
- Dados do produto:
name,description,type,category,slug,language,warrantyDays,images,enabled,externalReferencee os timestamps. - Variantes (
variants[]): cada variante traz seupricing(preço unitário, moeda, recorrência, trial, ciclos…), além desku,metadata,attributes,imagese timestamps próprios.
Variante embutida x variante individual
As variantes embutidas na resposta do produto não trazem productId nem pricing.costPerItem (custo por item / COGS). Esses dois campos só aparecem quando você lê a variante isoladamente em GET /v1/variants/{variantId} — veja Variantes. Ou seja: para análise de margem/lucro use a leitura individual da variante.
Quando usar
- Carregar a página de um produto (checkout, vitrine, painel) com todas as suas variantes de uma vez.
- Conferir a configuração atual antes de um Update (por exemplo, ver o
warrantyDaysou opricingvigente). - Resolver um
productIdrecebido de outro recurso (uma transação, uma assinatura) para mostrar nome, imagens e preço.
Quando não usar:
- Para descobrir/buscar produtos por nome, slug, categoria ou data, ou paginar o catálogo — use Listar.
- Para ler uma variante específica com
costPerItemeproductId— use Variantes (GET /v1/variants/{variantId}).
Requisição
Headers
| Cabeçalho | Obrigatório | Valor |
|---|---|---|
SelectKey | Sim | Sua chave de API. Produção: sl_live_…; sandbox: sl_test_…. Veja Autenticação. |
Por ser um GET, não há corpo nem Content-Type. A autenticação é sempre via header SelectKey — nunca Authorization: Bearer/Basic.
Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
productId | string | Sim | ID público do produto, no formato prd_… (ex.: prd_01hqzvabc). Trate como opaco — não faça parsing. |
Este endpoint não aceita parâmetros de query.
Exemplo curl
curl -X GET "https://api.selectwin.io/v1/products/prd_01hqzvabc" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Resposta
200 OK — o corpo é o objeto completo do produto.
{
"id": "prd_01hqzvabc",
"enabled": true,
"name": "Plano Premium",
"description": "Full access plan",
"type": "digital",
"language": "pt-BR",
"category": "saas",
"slug": "plano-premium",
"images": ["https://cdn.selectwin.io/p/img1.png"],
"warrantyDays": 30,
"variants": [
{
"id": "var_01hqzvabc",
"name": "Mensal",
"enabled": true,
"description": "Monthly billing",
"sku": "SKU-M",
"pricing": {
"oldPrice": 14900,
"unitPrice": 9900,
"currency": "BRL",
"schema": "unit",
"type": "recurring",
"daysTrial": 7,
"billingType": "prepaid",
"billingFrequency": "monthly",
"billingFrequencyCount": 1,
"billingExactDay": 10,
"cycles": 12,
"trialInterval": "day",
"trialIntervalCount": 7
},
"images": ["https://cdn.selectwin.io/v/var.png"],
"metadata": { "tier": "pro" },
"externalReference": "VAR-EXT-1",
"attributes": {},
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}
],
"externalReference": "PROD-EXT-1",
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}Campos do produto
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID do produto (prd_…). |
enabled | boolean | Se o produto está ativo (vendável). |
name | string | Nome do produto. |
description | string | Descrição do produto. |
type | string | Tipo do produto. Enum: physical, digital, other. |
language | string | Código de idioma (ex.: pt-BR). |
category | string | Categoria do produto. |
slug | string | Identificador amigável para URL. |
images | array | URLs das imagens do produto. |
warrantyDays | integer | Período de garantia, em dias (7–3650). |
externalReference | string | Sua referência externa do catálogo. |
variants | array | Lista de variantes embutidas (veja abaixo). |
createdAt / updatedAt | string | Timestamps em ISO 8601 UTC (…Z). |
Campos de cada variante (variants[])
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID da variante (var_…). |
name | string | Nome de exibição da variante. |
enabled | boolean | Se a variante é vendável. |
description | string | Descrição curta. |
sku | string | Código de estoque (SKU). |
pricing | object | Preço da variante (veja abaixo). |
images | array | Imagens da variante. |
metadata | object | Metadados livres (ex.: { "tier": "pro" }). |
attributes | object | Atributos chave-valor. |
externalReference | string | Referência externa do catálogo. |
createdAt / updatedAt | string | Timestamps ISO 8601 UTC. |
Campos de pricing
Todos os valores monetários são inteiros em centavos (9900 = R$ 99,00). Veja Convenções.
| Campo | Tipo | Descrição |
|---|---|---|
unitPrice | integer | Preço unitário, em centavos. |
oldPrice | integer | Preço "de" / original, em centavos (para mostrar desconto). |
currency | string | Moeda. Atualmente só BRL. |
schema | string | Esquema de cobrança. Hoje só unit. |
type | string | oneTime (cobrança única) ou recurring (assinatura). |
daysTrial | integer | Duração do trial em dias (derivado de trialInterval/trialIntervalCount). |
trialInterval | string | Unidade do trial: day, week, month, year. Só com type=recurring. |
trialIntervalCount | integer | Quantidade de unidades de trial. Só com type=recurring. |
billingType | string | Tipo de cobrança recorrente: prepaid, postpaid, exactday. |
billingFrequency | string | Cadência: daily, weekly, monthly, yearly. |
billingFrequencyCount | integer | Nº de unidades de frequência entre cobranças (ex.: monthly + 3 = trimestral). |
billingExactDay | integer | Dia do mês da cobrança quando billingType=exactday (1–31). |
cycles | integer | Total de ciclos de cobrança. Ausente/null = infinito. |
O que a leitura traz a mais que a lista
A leitura individual inclui warrantyDays, externalReference e o pricing completo de cada variante. Em Listar, cada item do data[] é uma projeção leve (sem variantes nem pricing), pensada para montar índices e tabelas rapidamente.
Erros
A API sinaliza falhas com um envelope padrão; trate sempre pelo error.code, não pela message. Veja Tratamento de Erros e o Catálogo de Códigos de Erro.
error.code | HTTP | Quando ocorre |
|---|---|---|
productIdIsInvalid | 400 | O productId informado tem formato inválido ou não existe. |
productIdNotFound | 404 | Não existe produto com esse ID na sua conta. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticada, mas sem permissão para o recurso. |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes. |
serverError | 500 | Erro interno — tente novamente com backoff. |
Exemplo de resposta 404:
{
"error": {
"code": "productIdNotFound",
"statusCode": 404,
"category": "client",
"message": "Product not found"
}
}Boas práticas
- Trate o
productIdcomo opaco. Armazene a string inteira; não confie no comprimento nem construa IDs manualmente. - Distinga
400de404.productIdIsInvalid(400) indica um ID malformado (provável bug no seu código);productIdNotFound(404) indica um produto que não existe (pode ter sido removido). Trate-os de forma diferente. - Para custo e margem, leia a variante individual.
pricing.costPerItemeproductIdnão vêm embutidos aqui; useGET /v1/variants/{variantId}(veja Variantes). - Sempre converta dinheiro dividindo por 100 só na exibição. Os valores chegam em centavos; nunca use ponto flutuante para cálculos monetários.
- Mostre apenas o que está
enabled. Tanto o produto quanto cada variante têm o flagenabled; respeite-o em vitrines e checkouts. - Não fique repetindo
GETpara detectar mudanças (polling). Para reagir a alterações de catálogo ou de assinatura, prefira Webhook Events.
Veja também
- Visão geral de Produtos — modelo do objeto, ciclo de vida e todas as operações.
- Listar produtos — buscar e paginar o catálogo (projeção leve).
- Criar produto — criar um produto com variantes.
- Atualizar produto — alterar dados do produto.
- Variantes — ler uma variante isolada (com
costPerItemeproductId). - Convenções e Códigos de Erro.
How is this guide?