Produtos

Visão geral

O recurso de Produtos (Products) representa seu catálogo. Cada produto agrupa uma ou mais

Introdução

O recurso de Produtos (Products) representa seu catálogo. Cada produto agrupa uma ou mais Variantes (Variants) — e é a variante que carrega a precificação. Um produto "Plano Premium" pode ter as variantes "Mensal", "Anual" e "Vitalício", cada uma com seu preço e regras de cobrança.

As variantes são o que você referencia em Transações (variantes oneTime) e em Assinaturas (variantes recurring).

Estrutura do Produto

{
  "id": "prd_01hqzvabc",
  "name": "Plano Premium",
  "slug": "plano-premium",
  "salesPage": "https://example.com/sales",
  "description": "Full access plan",
  "language": "pt-BR",
  "enabled": true,
  "salesQty": 42,
  "type": "digital",
  "category": "saas",
  "externalReference": "SKU-EXT-1",
  "warrantyDays": 7,
  "images": ["https://example.com/img1.png"],
  "imageAssetIds": null,
  "createdAt": "2026-04-12T17:56:33.000Z",
  "updatedAt": "2026-04-12T17:56:33.000Z",
  "variants": [
    {
      "id": "var_01hqzvabc",
      "productId": "prd_01hqzvabc",
      "name": "Mensal",
      "slug": "mensal",
      "description": "Monthly billing",
      "sku": "SKU-M",
      "primary": true,
      "enabled": true,
      "pricing": {
        "unitPrice": 9900,
        "oldPrice": null,
        "costPerItem": null,
        "currency": "BRL",
        "schema": "unit",
        "type": "recurring",
        "billingType": "prepaid",
        "billingFrequency": "monthly",
        "billingFrequencyCount": 1
      },
      "images": null,
      "metadata": null,
      "attributes": null,
      "externalReference": null,
      "checkoutUrl": null,
      "createdAt": "2026-04-12T17:56:33.000Z",
      "updatedAt": "2026-04-12T17:56:33.000Z"
    }
  ]
}

Respostas de produto e de variante não incluem merchant nem _links. Valores monetários (unitPrice, oldPrice, costPerItem) são inteiros em centavos (BRL). Datas em ISO 8601.

Campos do produto

CampoTipoDescrição
idstringIdentificador público (prd_...; ids legados pro_ também são lidos)
namestringNome do produto
slugstring | nullIdentificador legível para URLs (gerado pela API a partir do name)
salesPagestring | nullPágina de vendas
descriptionstring | nullDescrição
languagestring | nullIdioma (pt-BR, …)
enabledbooleanSe o produto está ativo
salesQtyinteger | nullQuantidade vendida (somente leitura)
typestringTipo: physical, digital ou other
categorystringCategoria de negócio
externalReferencestring | nullSua referência externa
warrantyDaysintegerDias de garantia
imagesarray | nullURLs de imagens
imageAssetIdsqualquer | nullReferências internas das imagens hospedadas
createdAt / updatedAtstring (ISO 8601)Datas
variantsarrayVariantes do produto (com pricing)

Modelo de Precificação (dual-axis)

A precificação vive na variante, em pricing, organizada em dois eixos independentes:

Eixo 1 — type (natureza da cobrança) · imutável

pricing.typeSignificadoOnde é usada
oneTimeCobrança única (default)Transações
recurringCobrança recorrenteAssinaturas
  • Uma variante oneTime não pode ser usada em assinatura (a assinatura exige variante recorrente) → variantNotRecurring (422).
  • O type é imutável após a criação → pricingTypeImmutable (422).

Eixo 2 — schema (como o preço é calculado) · imutável

pricing.schemaSignificado
unitPreço por unidade — unitPrice × quantity (default)
tieredPreço por faixas (tiersMode + tiers[])
packagePreço por pacote (transformQuantity)

O schema é imutável após a criação → pricingSchemaImmutable (422). Configurações de precificação inconsistentes com o schema escolhido retornam invalidPricing (422).

Campos de pricing

CampoAplica aDescrição
unitPriceambosPreço unitário em centavos (mín. 1; em schema=unit, mín. 500). Obrigatório exceto em schema=tiered
oldPriceambosPreço "de" (riscado/promocional), em centavos
costPerItemambosCusto do item em centavos (para margem; mín. 0)
currencyambosISO 4217 — apenas BRL (default BRL)
schemaambosunit | tiered | package (default unit, imutável)
typeambosoneTime | recurring (default oneTime, imutável)
daysTrialrecurringDias de trial (1–365)
billingTyperecurringprepaid, postpaid ou exactday (obrigatório quando type=recurring)
billingFrequencyrecurringdaily, weekly, monthly, yearly (obrigatório quando type=recurring)
billingFrequencyCountrecurringMultiplicador da frequência, 1–999 (obrigatório quando type=recurring)
billingExactDayrecurringDia fixo de cobrança, 1–31 (obrigatório quando billingType=exactday)
cyclesrecurringNº de ciclos, 1–999 (null = indefinido)
trialIntervalrecurringUnidade do trial: day, week, month, year
trialIntervalCountrecurringDuração do trial em unidades de trialInterval (1–365)
tiersModetieredgraduated ou volume (obrigatório quando schema=tiered)
tierstieredFaixas { upTo, unitPrice, flatPrice } (obrigatório quando schema=tiered)
transformQuantitypackage{ divideBy, round } (obrigatório quando schema=package)
usageTyperecurringlicensed (default) ou metered
usageAggregationmeteredsum, max, lastDuringPeriod, lastEver (obrigatório quando usageType=metered)
meterEventNamemeteredNome do evento de medição (obrigatório quando usageType=metered)

Em usageType=metered, a cobrança recorrente exige billingType=postpaid.

Na resposta, pricing traz todos os campos acima (os não aplicáveis vêm null); unitPrice, oldPrice e costPerItem sempre presentes (centavos ou null).

Recursos Disponíveis

RecursoMétodoEndpointDescrição
Criar produtoPOST/v1/productsCria produto (com variantes inline)
Listar produtosGET/v1/products · /v1/products/listallLista paginada · array completo
Consultar produtoGET/v1/products/{productId}Produto + variantes
Atualizar / ExcluirPUT/PATCH/DELETE/v1/products/{productId}Atualiza ou remove
VariantesGET/POST/PATCH/DELETE/v1/products/{id}/variants · /v1/variantsGerencia variantes

Integração com Outros Recursos

  • Transactions — variantes oneTime são cobradas em transações avulsas.
  • Subscriptions — variantes recurring compõem os itens da assinatura.
  • Coupons — descontos podem ser limitados a produtos/variantes específicos.
  • Checkouts — links de pagamento referenciam variantes por id.

How is this guide?

On this page