SelectwinDOCS
Produtos

Atualizar um produto

Atualize os dados de um produto existente — nome, descrição, categoria, status (enabled), garantia, página de vendas e demais campos do "cabeçalho" do produto — enviando uma requisição PUT ou PATCH co

Atualize os dados de um produto existente — nome, descrição, categoria, status (enabled), garantia, página de vendas e demais campos do "cabeçalho" do produto — enviando uma requisição PUT ou PATCH com o id do produto na URL. Use quando precisar corrigir informações de catálogo ou ativar/desativar a venda de um produto.

PUT /v1/products/{productId} · PATCH /v1/products/{productId}

Como funciona

A Selectwin expõe dois verbos para a mesma operação, ambos atendidos pelo mesmo handler:

  • PATCH — atualização parcial: envie só os campos que quer mudar; o resto permanece como está.
  • PUT — substituição da representação do produto: você descreve o estado desejado dos campos editáveis.

Na prática, como os dois compartilham o handler, enviar apenas os campos que deseja alterar funciona em ambos. Por clareza semântica, prefira PATCH para ajustes pontuais (ex.: trocar a categoria) e reserve PUT para quando estiver reescrevendo o conjunto dos dados do produto.

Importante

Este endpoint atualiza apenas os campos do produto. Ele não cria, edita nem remove variantes, e não altera preços. Os campos variants[] aparecem na resposta apenas para leitura. Para mexer em preço, SKU, trial ou frequência de cobrança, use os endpoints de Variantes.

O que o servidor faz

  1. Valida o productId da URL (formato e existência).
  2. Valida os campos enviados no corpo (tipos, enums e faixas — ex.: warrantyDays entre 7 e 3650).
  3. Aplica as mudanças e atualiza updatedAt.
  4. Retorna 200 OK com a representação atualizada do produto (incluindo a lista de variantes, somente leitura).

A operação é síncrona: ao receber 200, a mudança já está persistida. Não há etapa assíncrona nem evento de webhook obrigatório para concluir a edição.

Quando usar (e quando não usar)

Você quer…Use
Corrigir nome, descrição, categoria, idioma, slug, garantia, página de vendasEste endpoint (PUT/PATCH)
Ativar ou pausar a venda do produtoEste endpoint, com enabled: true/false
Mudar preço, trial, frequência de cobrança, SKUVariantes → Atualizar
Adicionar uma nova opção/preço ao produtoVariantes → Criar
Apenas conferir o estado atual antes de editarConsultar produto

Requisição

Headers

CabeçalhoObrigatórioUso
SelectKeySimSua chave de API. Em produção começa com sl_live_; em sandbox, sl_test_. Nunca use Authorization: Bearer/Basic.
Content-Type: application/jsonSimO corpo é JSON.
X-Idempotency-KeyRecomendadoEm escritas, garante que uma repetição da mesma requisição (timeout, retry) não aplique a mudança duas vezes. Veja Idempotência.

Parâmetros de caminho

NomeTipoObrigatórioDescrição
productIdstringSimID público do produto a atualizar (ex.: prd_01hqzvabc). Trate como opaco — veja Convenções.

Corpo

Todos os campos abaixo são opcionais na atualização — envie apenas os que deseja alterar. Valores monetários não se aplicam aqui (são propriedade das variantes).

CampoTipoDescrição
namestringNome do produto.
slugstringIdentificador amigável para URL (ex.: premium-course).
descriptionstringDescrição do produto.
enabledbooleanSe o produto está ativo (disponível para venda).
typestring · enum physical | digital | otherTipo do produto.
languagestringCódigo ISO do idioma (ex.: pt).
categorystringCategoria do produto.
externalReferencestringReferência do seu catálogo, para correlacionar com seu sistema.
warrantyDaysnumber · 7..3650Período de garantia em dias.
salesPagestringURL da página de vendas.

Exemplo PATCH (ajuste pontual)

Trocar apenas a categoria e pausar a venda:

curl -X PATCH "https://api.selectwin.io/v1/products/prd_01hqzvabc" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
  -H "Content-Type: application/json" \
  -d '{
    "category": "courses",
    "enabled": false
  }'

Exemplo PUT (vários campos)

curl -X PUT "https://api.selectwin.io/v1/products/prd_01hqzvabc" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Premium Course",
    "slug": "premium-course",
    "description": "Curso completo (2026)",
    "enabled": true,
    "type": "digital",
    "language": "pt",
    "category": "courses",
    "warrantyDays": 30,
    "salesPage": "https://loja.com/premium",
    "externalReference": "SKU-EXT-1"
  }'

Resposta

200 OK com a representação atualizada do produto.

{
  "id": "prd_01hqzvabc",
  "enabled": true,
  "name": "Plano Premium",
  "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",
        "billingType": "prepaid",
        "billingFrequency": "monthly",
        "billingFrequencyCount": 1,
        "cycles": 12
      },
      "updatedAt": "2026-04-12T17:56:33.000Z",
      "createdAt": "2026-04-12T17:56:33.000Z"
    }
  ],
  "updatedAt": "2026-04-12T17:56:33.000Z",
  "createdAt": "2026-04-12T17:56:33.000Z"
}

Campos-chave da resposta:

CampoTipoObservação
idstringID público do produto.
enabledbooleanEstado de venda após a atualização.
name, type, language, category, slugstringDados do produto.
imagesarrayURLs de imagem associadas.
warrantyDaysintegerGarantia em dias.
variants[]arrayVariantes do produto (preço, cobrança), somente leitura aqui.
updatedAt / createdAtstring (ISO 8601 UTC)Carimbos de tempo; updatedAt reflete esta edição.

A resposta do update tem um formato próprio

A representação retornada pela atualização não é idêntica à da leitura. Ela inclui warrantyDays mas omite description e externalReference. Se você precisa do objeto completo logo após editar — inclusive description e externalReference —, faça um GET /v1/products/{productId} (Consultar).

Erros

Trate sempre pelo error.code (estável), não pela message. Veja o Catálogo de Códigos de Erro e Tratamento de Erros.

error.codeHTTPQuando ocorre
productIdIsInvalid400O productId da URL tem formato inválido ou não existe.
invalidParameters400Algum campo do corpo falhou na validação (tipo, enum, faixa). Veja error.params para o campo.
productIdNotFound404Nenhum produto com esse ID na sua conta.
unauthorized401SelectKey ausente, inválida ou revogada.
forbidden403Autenticado, mas sem permissão para esta operação.
unprocessableEntity422Regra de negócio impediu a atualização.
tooManyRequests429Limite de requisições excedido — repita com backoff (respeite error.retryAfterMinutes).
serverError500Erro interno — repita; se persistir, contate o suporte.

Tentar alterar preço/variante por aqui não funciona: os campos variants[] não são editáveis neste endpoint. Use Variantes, onde pricing.type e pricing.schema são imutáveis após a criação (pricingTypeImmutable / pricingSchemaImmutable, 422).

Excluir um produto

Para remover um produto do catálogo, use o endpoint dedicado:

DELETE /v1/products/{productId}

curl -X DELETE "https://api.selectwin.io/v1/products/prd_01hqzvabc" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

Resposta 200 OK:

{
  "id": "prd_01hqzvabc",
  "resource": "product",
  "deleted": true
}
error.codeHTTPQuando ocorre
productIdNotFound404Produto inexistente.
productIdIsInvalid400ID inválido.
productDeleteFailed422A exclusão não pôde ser concluída (ex.: vínculos ativos).

Atenção

A exclusão remove o produto e suas variantes do catálogo. Antes de excluir, verifique se não há ofertas, links de checkout ou assinaturas em uso dependendo dele. Em caso de dúvida, prefira desativar (enabled: false) em vez de excluir.

Boas práticas

  • Prefira PATCH para ajustes pontuais. Envie só os campos que mudam; isso reduz o risco de sobrescrever algo sem querer.
  • Use X-Idempotency-Key em toda atualização. Em retries por timeout, evita aplicar a mesma mudança duas vezes. Veja Idempotência.
  • Não use este endpoint para preço. Preço, trial e frequência vivem nas Variantes; alterá-los aqui não tem efeito.
  • Desative em vez de excluir quando quiser apenas tirar o produto de venda preservando histórico: PATCH com enabled: false.
  • Após editar, recarregue com GET se precisar de description/externalReference, pois a resposta do update os omite.
  • Respeite as faixas do contrato. warrantyDays deve ficar entre 7 e 3650; valores fora disso retornam invalidParameters (400).
  • Trate erros pelo error.code, com fallback por error.statusCode (429/5xx → backoff).

Veja também

How is this guide?

On this page