Produtos
Como funciona o produto da Venddor (seller, catálogo mestre, SKU, preço, estoque, status, categorias) e o mapa das rotas da API.
Um produto é o que a loja vende. Ele tem um nome, um preço, uma quantidade em estoque, uma categoria, imagens e um seller (lojista), que é a empresa dona da oferta e quem recebe o pedido. Todo ERP, PDV, marketplace e planilha de catálogo que conversa com a Venddor passa por esta seção: é aqui que você cria o produto, muda o preço, ajusta o estoque, desativa e consulta o que existe.
Esta seção documenta a API de administração do cadastro de produtos (/api/v1/admin/products...): dinheiro em centavos inteiros (4990), ids UUID, datas RFC 3339 e operações como clonar, histórico de alterações, lote, importação e variações.
Os recursos que moram "dentro" do produto têm seções próprias, para nenhuma página ficar longa demais: Mídia do produto, Variações e opções, Preço e estoque, Conteúdo e características e Lote, importação e exportação.
Como funciona
O ciclo de vida de um produto
O produto criado por um administrador já nasce no status que você pediu. O produto criado por um seller pode passar antes por moderação, se a loja tiver a pré-moderação ligada: ele nasce em R e só vira A quando alguém aprova.
O campo status é uma letra:
| Letra | Nome | O que significa |
|---|---|---|
A | Ativo | Aparece nas listagens, na busca e abre pelo link. É o único status que pode ser comprado. |
H | Oculto | Fora das listagens e da busca, mas abre se alguém tiver o link direto. |
D | Desativado | Fora da loja inteira: nem pelo link abre (404). |
R | Aguardando aprovação | Produto novo de seller esperando a moderação. Não aparece na loja. |
X | Rejeitado | A moderação recusou. O motivo vem em rejected_reason. |
Além de status, a API devolve intended_status (a letra A, D ou H para a qual o produto volta quando for aprovado) e approval_status (pending, approved ou rejected), campo derivado do status. Em quase todas as rotas você pode mandar o nome longo no lugar da letra: active (A), disabled (D), hidden (H), pending (R) e rejected (X). A criação só aceita A, D e H; R e X pertencem ao fluxo de moderação.
Ter status: "A" é necessário, mas não suficiente para aparecer na loja. A vitrine também esconde produtos cujo seller está inativo, cuja categoria está desativada, com avail_since no futuro (data de lançamento) e, conforme a configuração da loja, sem estoque.
O fluxo típico de uma integração (ERP, catálogo)
- Descobrir os ids de seller e categoria
Antes de criar produtos, leia os sellers da loja e a árvore de categorias. Cada produto precisa de um
vendor_ide de umcategory_id(UUID). Guarde-os na sua configuração. - Criar o produto
Criar produto devolve o
id. Grave esse id ao lado do seu código interno: ele é a chave de todas as chamadas seguintes. Mande sempre osku: ele é único na loja, e uma repetição (por exemplo, depois de um timeout) volta como 409 em vez de duplicar o produto. - Complementar o cadastro
Envie as imagens (Mídia), as características (Conteúdo), as faixas de preço e o estoque (Preço e estoque) e, se for o caso, as variações (Variações e opções).
- Manter preço e estoque em dia
Alterar produto muda só os campos que você enviar. Para muitos produtos de uma vez, use o lote em vez de um laço de PUTs.
- Acompanhar mudanças
Histórico de alterações mostra quem mudou preço, nome, status e outros campos, e quando.
Conceitos-chave
Autenticação
Faça login (POST /api/v1/auth/login com {"email","password"}) e use access_token como Bearer. O login tem limite de requisições (429): guarde o token e reaproveite-o até expirar. A leitura exige o privilégio view_catalog ou manage_catalog; a escrita exige manage_catalog.
Ids: UUID, número curto e SKU
Cada produto tem três identificadores, e só um deles serve de {id} na URL:
id(UUID, 36 caracteres): a chave da API. EmPUTeDELETE, qualquer outro valor é recusado. A consulta também aceita oslug.display_id(inteiro, como10499): o número curto que o painel mostra. É só para leitura humana; a API não o aceita como{id}.sku(texto): o código do produto. Veja a seção seguinte.
SKU e código do produto
O sku é o código que a sua empresa usa para o item. Ele é único na loja inteira (não só por seller), e reutilizar o SKU de outro produto devolve 409. O SKU de um produto excluído pode ser reutilizado. O sku é opcional: sem ele, o produto fica sem código.
O filtro sku da lista contém o texto (sem diferenciar maiúsculas), não exige igualdade.
Outros códigos que o produto pode ter: barcode (EAN/GTIN, com regras de unicidade e obrigatoriedade configuráveis por loja), vendor_internal_sku (código interno do seller) e ncm_code (8 dígitos, fiscal, usado na NF-e).
Dinheiro
Todo valor de dinheiro é inteiro em centavos: 4990 é R$ 49,90. Os campos de dinheiro do produto são price (preço de venda), list_price (preço "de", o valor riscado que a loja mostra antes da promoção) e cost_price (custo), e shipping_freight (frete fixo). Cada produto também traz price_str e list_price_str em decimal, só para leitura.
O servidor tolera clientes que erram a unidade: um número com casas decimais (49.90) é lido como reais e vira 4990, e uma string como "R$ 49,90" também é aceita. Mesmo assim, envie sempre o inteiro em centavos: 49 sem casas decimais é R$ 0,49.
Estas regras valem para todos os campos: preço zero é permitido (veja zero_price_action) e negativo é recusado; o list_price, quando maior que zero, não pode ser menor que o price (list_price_below_price).
Estoque
quantityé a quantidade disponível na unidade de venda do produto.track_inventoryliga o controle de estoque.sale_unité a unidade de venda:un(padrão),kg,cx,l,parou um texto livre (comsale_unit_labelpara o rótulo). Comallow_fractional: trueo cliente pode comprar meia unidade (0,5 kg).min_quantity,max_quantityequantity_steplimitam a compra: mínimo, máximo (0 = sem limite) e múltiplo (quantity_step: 6vende de seis em seis).low_stock_alerté o limite de "estoque baixo" usado pelos alertas e pelo filtrolow_stock.out_of_stock_actiondiz o que a loja faz com o produto zerado:Nesconde o botão de compra,Baceita encomenda (back-order),Smostra o formulário "avise-me quando chegar" (padrão na criação pela API).
Alterar quantity por PUT grava um movimento no extrato de estoque (com o motivo de stock_adjust_reason). Para ajustes de estoque dedicados, veja Preço e estoque.
O preço zero e zero_price_action
O que acontece quando um produto custa R$ 0,00 é decisão do campo zero_price_action, cobrada quando o cliente tenta colocar o item no carrinho: P vende normalmente por zero, R bloqueia a compra online e A exige que o cliente peça um orçamento. O padrão na criação pela API é R, que protege contra um produto "de graça" por engano.
Seller, catálogo mestre e ofertas
A loja pode ser um marketplace, com vários sellers vendendo na mesma vitrine. Dois conceitos importam aqui:
- Produto de seller (oferta). É o produto comum, com
vendor_iddo seller. O preço, o estoque, o SKU e o status são do seller. - Produto mestre. Um cadastro único de um item (nome, descrição, imagens, características, EAN) compartilhado por várias ofertas. Cada oferta aponta para o mestre em
master_product_id. Os campos que o mestre controla (por exemplo nome, descrição e categoria, conforme a configuração da loja) são ignorados quando você os envia numPUTde uma oferta ligada. A API de catálogo mestre fica na referência completa; aqui você usa Ligar a um mestre para ligar e desligar uma oferta.
A lista de produtos de administração (/api/v1/admin/products) mostra ofertas de sellers e produtos sem seller, e deixa de fora os cadastros mestres.
Categorias
Todo produto tem uma categoria principal (category_id, obrigatória) e pode ter categorias adicionais (additional_category_ids). Para trocar as categorias de um produto já criado, veja Categorias do produto. Uma categoria desativada esconde seus produtos da loja.
Imagens, características e variações
- Imagens e vídeos ficam na seção Mídia do produto. A resposta do produto já traz a lista
images. - Características (marca, cor, material, voltagem...) descrevem o produto e alimentam os filtros da loja. Ficam em Conteúdo e características.
- Opções (um campo que o cliente escolhe na compra, como "gravação") e variações (cada tamanho/cor é um produto filho com SKU, preço e estoque próprios) ficam em Variações e opções. Um produto-pai de variações tem
is_variation: falsee filhos comis_variation: true; a lista de administração traz pais e filhos.
Idiomas
Nome e descrições existem por idioma. O objeto descriptions (chave = código do idioma, como pt-BR ou en) traz, por idioma, name, description, short_description, promo_text, highlight_text, seo_title, seo_description e meta_keywords. No PUT, só as chaves de idioma que você enviar são regravadas. Sem descriptions, os campos planos (name, description) valem para o idioma padrão.
Exclusão suave e lixeira
DELETE não apaga: marca o produto como excluído e o envia para a lixeira, de onde um administrador pode restaurá-lo por 30 dias. Depois disso a limpeza automática o remove de vez. Os vínculos (categorias, características, imagens) são preservados para a restauração ser completa. O SKU volta a ficar livre assim que o produto vai para a lixeira.
Recursos opcionais da loja
Algumas rotas dependem de um recurso que a loja precisa ter ligado (por exemplo, o catálogo mestre e o cálculo de embalagem dos Correios). Quando está desligado, a rota responde 403 ou 404 com a mensagem do recurso. As páginas dizem quais rotas são assim.
Endpoints
Auth: Admin é um administrador (Bearer).
| Método | Rota | O que faz | Auth | Página |
|---|---|---|---|---|
| GET | /api/v1/admin/products | Lista produtos | Admin | Listar produtos |
| GET | /api/v1/admin/products/{id} | Consulta um produto | Admin | Consultar produto |
| POST | /api/v1/admin/products | Cria produto | Admin | Criar produto |
| PUT | /api/v1/admin/products/{id} | Altera produto | Admin | Alterar produto |
| DELETE | /api/v1/admin/products/{id} | Exclui produto | Admin | Excluir produto |
| GET | /api/v1/admin/products/{id}/categories | Categorias do produto | Admin | Categorias do produto |
| PUT | /api/v1/admin/products/{id}/categories | Troca as categorias do produto | Admin | Categorias do produto |
| POST | /api/v1/admin/products/{id}/clone | Duplica o produto | Admin | Clonar produto |
| POST | /api/v1/admin/products/{id}/link-master | Liga a oferta a um mestre | Admin | Ligar a um mestre |
| DELETE | /api/v1/admin/products/{id}/unlink-master | Desliga a oferta do mestre | Admin | Ligar a um mestre |
| GET | /api/v1/admin/products/{id}/changelog | Histórico de alterações | Admin | Histórico de alterações |
As rotas aninhadas do produto estão nas outras seções:
| Assunto | Seção |
|---|---|
| Imagens, vídeos e anexos | Mídia do produto |
| Opções, variações e variações unificadas | Variações e opções |
| Faixas de preço, estoque, recorrência e embalagem de envio | Preço e estoque |
| Características, SEO, tags, cross-sell, produtos obrigatórios, avaliações | Conteúdo e características |
| Ações em lote, importação e exportação | Lote, importação e exportação |
Erros comuns
- Criar produto sem
vendor_idou semcategory_id. Os dois são obrigatórios. Sem seller a resposta é 400vendor_required; sem categoria, 400category_required. - Usar o SKU ou o
display_idcomo{id}na URL. O{id}é o UUID. EmPUTa resposta é 400invalid product id, e a mensagem explica de onde sai o UUID. - Mandar dinheiro na unidade errada. Envie centavos inteiros (
4990), nunca49.90:49sem casas decimais é R$ 0,49. - Tratar o
DELETEcomo definitivo. Ele envia o produto para a lixeira por 30 dias. A exclusão permanente é feita no painel. - Editar o nome ou a descrição de uma oferta ligada a um mestre e achar que salvou. Os campos que o mestre controla são ignorados em silêncio. Edite o mestre.
- Repetir
POSTdepois de um timeout semsku. Sem um código único o servidor não tem como reconhecer o repetido, e o produto é duplicado.