SelectwinDOCS
Produtos

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, externalReference e os timestamps.
  • Variantes (variants[]): cada variante traz seu pricing (preço unitário, moeda, recorrência, trial, ciclos…), além de sku, metadata, attributes, images e 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 warrantyDays ou o pricing vigente).
  • Resolver um productId recebido 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 costPerItem e productId — use Variantes (GET /v1/variants/{variantId}).

Requisição

Headers

CabeçalhoObrigatórioValor
SelectKeySimSua 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 SelectKeynunca Authorization: Bearer/Basic.

Parâmetros de caminho

NomeTipoObrigatórioDescrição
productIdstringSimID 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

CampoTipoDescrição
idstringID do produto (prd_…).
enabledbooleanSe o produto está ativo (vendável).
namestringNome do produto.
descriptionstringDescrição do produto.
typestringTipo do produto. Enum: physical, digital, other.
languagestringCódigo de idioma (ex.: pt-BR).
categorystringCategoria do produto.
slugstringIdentificador amigável para URL.
imagesarrayURLs das imagens do produto.
warrantyDaysintegerPeríodo de garantia, em dias (7–3650).
externalReferencestringSua referência externa do catálogo.
variantsarrayLista de variantes embutidas (veja abaixo).
createdAt / updatedAtstringTimestamps em ISO 8601 UTC (…Z).

Campos de cada variante (variants[])

CampoTipoDescrição
idstringID da variante (var_…).
namestringNome de exibição da variante.
enabledbooleanSe a variante é vendável.
descriptionstringDescrição curta.
skustringCódigo de estoque (SKU).
pricingobjectPreço da variante (veja abaixo).
imagesarrayImagens da variante.
metadataobjectMetadados livres (ex.: { "tier": "pro" }).
attributesobjectAtributos chave-valor.
externalReferencestringReferência externa do catálogo.
createdAt / updatedAtstringTimestamps ISO 8601 UTC.

Campos de pricing

Todos os valores monetários são inteiros em centavos (9900 = R$ 99,00). Veja Convenções.

CampoTipoDescrição
unitPriceintegerPreço unitário, em centavos.
oldPriceintegerPreço "de" / original, em centavos (para mostrar desconto).
currencystringMoeda. Atualmente só BRL.
schemastringEsquema de cobrança. Hoje só unit.
typestringoneTime (cobrança única) ou recurring (assinatura).
daysTrialintegerDuração do trial em dias (derivado de trialInterval/trialIntervalCount).
trialIntervalstringUnidade do trial: day, week, month, year. Só com type=recurring.
trialIntervalCountintegerQuantidade de unidades de trial. Só com type=recurring.
billingTypestringTipo de cobrança recorrente: prepaid, postpaid, exactday.
billingFrequencystringCadência: daily, weekly, monthly, yearly.
billingFrequencyCountintegerNº de unidades de frequência entre cobranças (ex.: monthly + 3 = trimestral).
billingExactDayintegerDia do mês da cobrança quando billingType=exactday (1–31).
cyclesintegerTotal 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.codeHTTPQuando ocorre
productIdIsInvalid400O productId informado tem formato inválido ou não existe.
productIdNotFound404Não existe produto com esse ID na sua conta.
unauthorized401SelectKey ausente, inválida ou revogada.
forbidden403Autenticada, mas sem permissão para o recurso.
tooManyRequests429Limite de requisições excedido — respeite error.retryAfterMinutes.
serverError500Erro 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 productId como opaco. Armazene a string inteira; não confie no comprimento nem construa IDs manualmente.
  • Distinga 400 de 404. 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.costPerItem e productId não vêm embutidos aqui; use GET /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 flag enabled; respeite-o em vitrines e checkouts.
  • Não fique repetindo GET para detectar mudanças (polling). Para reagir a alterações de catálogo ou de assinatura, prefira Webhook Events.

Veja também

How is this guide?

On this page