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
- Valida o
productIdda URL (formato e existência). - Valida os campos enviados no corpo (tipos, enums e faixas — ex.:
warrantyDaysentre 7 e 3650). - Aplica as mudanças e atualiza
updatedAt. - Retorna
200 OKcom 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 vendas | Este endpoint (PUT/PATCH) |
| Ativar ou pausar a venda do produto | Este endpoint, com enabled: true/false |
| Mudar preço, trial, frequência de cobrança, SKU | Variantes → Atualizar |
| Adicionar uma nova opção/preço ao produto | Variantes → Criar |
| Apenas conferir o estado atual antes de editar | Consultar produto |
Requisição
Headers
| Cabeçalho | Obrigatório | Uso |
|---|---|---|
SelectKey | Sim | Sua chave de API. Em produção começa com sl_live_; em sandbox, sl_test_. Nunca use Authorization: Bearer/Basic. |
Content-Type: application/json | Sim | O corpo é JSON. |
X-Idempotency-Key | Recomendado | Em 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
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
productId | string | Sim | ID 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).
| Campo | Tipo | Descrição |
|---|---|---|
name | string | Nome do produto. |
slug | string | Identificador amigável para URL (ex.: premium-course). |
description | string | Descrição do produto. |
enabled | boolean | Se o produto está ativo (disponível para venda). |
type | string · enum physical | digital | other | Tipo do produto. |
language | string | Código ISO do idioma (ex.: pt). |
category | string | Categoria do produto. |
externalReference | string | Referência do seu catálogo, para correlacionar com seu sistema. |
warrantyDays | number · 7..3650 | Período de garantia em dias. |
salesPage | string | URL 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:
| Campo | Tipo | Observação |
|---|---|---|
id | string | ID público do produto. |
enabled | boolean | Estado de venda após a atualização. |
name, type, language, category, slug | string | Dados do produto. |
images | array | URLs de imagem associadas. |
warrantyDays | integer | Garantia em dias. |
variants[] | array | Variantes do produto (preço, cobrança), somente leitura aqui. |
updatedAt / createdAt | string (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.code | HTTP | Quando ocorre |
|---|---|---|
productIdIsInvalid | 400 | O productId da URL tem formato inválido ou não existe. |
invalidParameters | 400 | Algum campo do corpo falhou na validação (tipo, enum, faixa). Veja error.params para o campo. |
productIdNotFound | 404 | Nenhum produto com esse ID na sua conta. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para esta operação. |
unprocessableEntity | 422 | Regra de negócio impediu a atualização. |
tooManyRequests | 429 | Limite de requisições excedido — repita com backoff (respeite error.retryAfterMinutes). |
serverError | 500 | Erro 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, ondepricing.typeepricing.schemasã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.code | HTTP | Quando ocorre |
|---|---|---|
productIdNotFound | 404 | Produto inexistente. |
productIdIsInvalid | 400 | ID inválido. |
productDeleteFailed | 422 | A 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
PATCHpara ajustes pontuais. Envie só os campos que mudam; isso reduz o risco de sobrescrever algo sem querer. - Use
X-Idempotency-Keyem 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:
PATCHcomenabled: false. - Após editar, recarregue com
GETse precisar dedescription/externalReference, pois a resposta do update os omite. - Respeite as faixas do contrato.
warrantyDaysdeve ficar entre 7 e 3650; valores fora disso retornaminvalidParameters(400). - Trate erros pelo
error.code, com fallback porerror.statusCode(429/5xx → backoff).
Veja também
- Visão geral de Produtos — modelo do objeto e ciclo de vida.
- Criar produto — criação com variantes no mesmo payload.
- Consultar produto — objeto completo (inclui
descriptioneexternalReference). - Listar produtos — busca e filtros do catálogo.
- Variantes — editar preço, SKU, trial e frequência de cobrança.
- Convenções · Idempotência · Códigos de Erro
How is this guide?