Conteúdo e características do produto
Como um produto recebe suas características, SEO, tags, vendas cruzadas e produtos obrigatórios, e o mapa de todas as rotas dessa área.
Um produto tem mais do que nome e preço. Esta seção cobre tudo o que descreve e conecta o produto na vitrine: as características (cor, material, peso, marca...), o SEO (endereço, título e descrição para o Google), as tags, os produtos sugeridos (venda cruzada) e os produtos obrigatórios.
Todas as rotas daqui são "por produto": você informa o id do produto no caminho (/products/{id}/...). Para criar o produto, veja Criar produto; para o modelo do produto, ids, dinheiro e status, veja a home de Produtos.
Como funciona
O modelo de características, do zero
Pense numa ficha técnica. A loja define quais linhas a ficha pode ter (a definição), e cada produto preenche as linhas que se aplicam a ele (o valor).
| Peça | O que é | Exemplo |
|---|---|---|
| Característica (feature) | A definição de uma linha da ficha: nome, tipo, onde aparece e se filtra. É da loja, não do produto. | "Material", tipo select |
| Tipo | Como o valor é guardado e mostrado (tabela abaixo). | select, text, number |
| Opção (variant na API) | Um valor pré-cadastrado de uma característica de seleção. | "Algodão", "Poliéster" |
| Grupo (feature group) | Uma característica do tipo group que serve de "título de seção". As outras apontam para ele em group_id. A vitrine agrupa a ficha por grupo. | "Dimensões" (grupo) com "Peso" e "Largura" |
| Valor no produto | A ligação entre um produto, uma característica e um valor. Um por característica em cada produto. | Camiseta X, Material = Algodão |
Tipos de característica e como enviar o valor
O feature_type da definição manda no formato do valor. Em PUT /features (e /characteristics) cada item da lista tem feature_id e um destes campos:
feature_type | Para que serve | O que enviar no valor | Filtra na vitrine? |
|---|---|---|---|
select | Uma opção de uma lista fechada (Material) | variant_id (UUID da opção) ou value_text com o nome ou código da opção | Sim |
multi_select | Lista fechada, "várias opções" | Igual a select. Atenção: a API guarda um valor por característica, então só uma opção cabe | Sim |
color | Como select, com cor de amostra na opção | Igual a select | Sim |
brand | Marca, lista aberta | variant_id ou value_text. Texto novo cria a marca | Sim |
author | Autor ou criador, lista aberta | Igual a brand | Sim |
text | Texto livre | value_text | Não |
number | Número inteiro, com prefixo e sufixo da definição (ex.: sufixo kg) | value_num, inteiro. Número com casas decimais é multiplicado por 100 | Não |
date | Data | value_date, texto AAAA-MM-DD | Não |
bool | Sim ou não | value_text igual a "true" ou "false" | Não |
group | Título de seção, não recebe valor | (nada) | Não |
Em select, multi_select e color, um texto que não casa com nenhuma opção é recusado, e a mensagem lista as opções aceitas. O casamento ignora maiúsculas e acentos e também reconhece o dicionário de sinônimos da loja. Só brand e author criam a opção que não existe.
Característica ou "característica"? As duas rotas
.../products/{id}/features | .../products/{id}/characteristics | |
|---|---|---|
GET | Valores do produto | O mesmo |
PUT | Substitui todos os valores | O mesmo |
POST | Não existe | Adiciona (ou troca) uma característica, sem tocar nas outras |
Para ler as definições das características (nome, tipo e opções), use o cadastro de Características; as rotas desta seção lidam só com os valores gravados em cada produto. Veja Características do produto.
O que aparece onde na vitrine
São quatro marcas na definição da característica (ajustadas no cadastro de Características, fora desta seção):
| Marca | Efeito |
|---|---|
display_on_product | A característica aparece na ficha técnica da página do produto. |
display_on_catalog | O valor aparece como selo no cartão do produto nas listagens. |
filterable | A característica vira filtro lateral da categoria (só os tipos de seleção da tabela acima, e só se algum produto tem valor). |
comparable | Entra na tabela de comparação de produtos. |
Além disso, status precisa ser A (ativa) e categories_path (lista de categorias onde a característica vale; vazio significa todas) precisa incluir a categoria do filtro.
SEO, tags, vendas cruzadas e obrigatórios
- SEO do produto são quatro campos:
slug(o endereço),seo_title,seo_descriptionemeta_keywords. Dá para escrever à mão ou gerar a partir do nome e da descrição. Trocar o slug cria redirecionamentos automáticos (SEO do produto). - Tags são rótulos livres ("Lançamento", "Verão 2026") compartilhados pela loja inteira (Tags e vendas cruzadas).
- Venda cruzada é uma lista ordenada de outros produtos que a vitrine sugere ("quem viu este também gostou"). Produto obrigatório é um item que acompanha este, como a pilha de um brinquedo, e pode ser marcado como obrigatório (Produtos obrigatórios).
Autenticação e permissões
Todas as rotas usam Authorization: Bearer <JWT> de um usuário administrador, com ids em UUID e erros no formato {"error":"...","detail":"..."}. O privilégio exigido é manage_features para as características; para o resto, view_catalog ou manage_catalog para ler e manage_catalog para gravar.
Endpoints
Auth: Admin é o administrador (Bearer).
| Método | Rota | O que faz | Auth | Página |
|---|---|---|---|---|
| GET | /api/v1/admin/products/{id}/features | Valores de características do produto | Admin | Características |
| PUT | /api/v1/admin/products/{id}/features | Substitui todos os valores | Admin | Características |
| GET | /api/v1/admin/products/{id}/characteristics | Valores (apelido de /features) | Admin | Apelido characteristics |
| POST | /api/v1/admin/products/{id}/characteristics | Adiciona ou troca uma característica | Admin | Apelido characteristics |
| PUT | /api/v1/admin/products/{id}/characteristics | Substitui todos os valores (apelido) | Admin | Apelido characteristics |
| GET | /api/v1/admin/products/{id}/seo | Lê o SEO | Admin | SEO do produto |
| PUT | /api/v1/admin/products/{id}/seo | Grava o SEO | Admin | SEO do produto |
| POST | /api/v1/admin/products/{id}/seo/generate | Gera o SEO a partir do produto | Admin | SEO do produto |
| GET | /api/v1/admin/products/{id}/tags | Tags do produto | Admin | Tags e vendas cruzadas |
| PUT | /api/v1/admin/products/{id}/tags | Substitui as tags | Admin | Tags e vendas cruzadas |
| GET | /api/v1/admin/products/{id}/cross-sells | Produtos sugeridos | Admin | Tags e vendas cruzadas |
| PUT | /api/v1/admin/products/{id}/cross-sells | Substitui os sugeridos | Admin | Tags e vendas cruzadas |
| GET | /api/v1/admin/products/{id}/required-products | Produtos obrigatórios | Admin | Produtos obrigatórios |
| POST | /api/v1/admin/products/{id}/required-products | Adiciona um obrigatório | Admin | Produtos obrigatórios |
| PUT | /api/v1/admin/products/{id}/required-products | Substitui a lista | Admin | Produtos obrigatórios |
| DELETE | /api/v1/admin/products/{id}/required-products/{requiredId} | Remove um obrigatório | Admin | Produtos obrigatórios |
Erros comuns
- Mandar só o que mudou em
PUT /features. A rota troca tudo. Se você enviar só a cor, o produto perde as demais características. Para acrescentar uma, usePOST /characteristics, ou leia a lista, altere e devolva inteira. - Achar que o erro desfaz a gravação. Não desfaz. Os valores antigos são apagados antes de os novos entrarem; um item inválido deixa o produto com parte dos valores, ou com nenhum.
- Enviar duas vezes a mesma característica (para simular
multi_select). Responde 500 por duplicidade: há um valor por característica em cada produto. - Texto que não é uma opção. Em característica de seleção,
value_textprecisa casar com uma opção existente. Descubra as opções e seus ids nas rotas de Características. - Mandar
value_numdecimal.1.5vira150. Envie sempre inteiro (e use sufixo ou prefixo na definição para a unidade). - Gerar o SEO de um produto já publicado.
seo/generatesobrescreve o slug com o nome atual do produto; o endereço antigo passa a redirecionar. - Esperar que a venda cruzada devolva tudo o que você enviou. A leitura só devolve produtos ativos e visíveis na vitrine.