Lote, importação e exportação
Como alterar, importar e exportar muitos produtos de uma vez, com simulação, desfazer e tarefas em segundo plano, e o mapa de todas as rotas.
Uma loja com milhares de produtos não se mantém com um PUT por vez. Esta seção reúne as rotas que agem sobre muitos produtos em uma só chamada: ações em lote (status, preço, categoria, exclusão, edição de campos), edição de células no estilo planilha, importação e exportação em CSV, XLSX e XML, e duas operações de manutenção.
Todas ficam em /api/v1/admin/products/.... Para o modelo do produto em si (ids, dinheiro, status, produto mestre x do seller), leia antes a seção Produtos.
Como funciona
O jeito seguro de rodar um lote
- Simule
Envie o lote com
"simulate": true. Comfiltervocê recebe o total, uma amostra de 10 registros com valores de antes e depois e umconfirm_token. Com lista de ids você recebe uma linha de prévia por id. Nada é gravado. - Confira
Veja o total e a amostra. Se o total não é o que você esperava, corrija o filtro e simule de novo.
- Confirme
Envie o mesmo corpo de novo, sem
simulate, acrescentando oconfirm_token. Menos de 50 registros: a resposta é imediata (200). 50 ou mais:202com uma tarefa. - Desfaça se foi engano
Guarde o
undo_idda resposta.POST /api/v1/admin/bulk-undo/{undo_id}devolve os valores anteriores (e restaura da lixeira os produtos excluídos).
Qual operação para qual tarefa
| Quero... | Use |
|---|---|
| Mudar status, preço, categoria ou seller de uma lista ou de um filtro | Ações em lote (POST /products/bulk) |
| O mesmo, com uma rota dedicada por ação | Rotas de lote dedicadas |
| Editar nomes, SKUs, preços, estoque, dimensões, textos de SEO, linha a linha ou por transformação ("acrescentar - PROMO ao nome") | Edição estilo planilha |
| Carregar um arquivo CSV/XLSX em uma chamada | Importar um arquivo |
| Pré-visualizar, mapear colunas, rodar importações grandes em segundo plano | Assistente de importação |
| Baixar o catálogo | Exportar |
| Preencher códigos HS, ou zerar o estoque da loja antes de uma carga completa | Manutenção |
Conceitos-chave
Duas formas de escolher os produtos
Lista de ids (product_ids): o jeito clássico. Todos os ids precisam ser UUIDs de produto (o número curto exibido na tela não é aceito).
Filtro (filter): o servidor encontra os produtos. Chaves aceitas (uma chave fora desta lista é recusada com 400 invalid_filter, então um erro de digitação nunca amplia o lote):
| Chave | Significado |
|---|---|
name_contains, name_starts_with | Parte do nome / começo do nome |
sku, ean | Valor exato, ou lista |
sku_contains | Parte do SKU |
brand | Marca, sem diferenciar maiúsculas |
status | active (A), disabled (D), hidden (H), pending (R), rejected (X), ou a letra |
category_id | UUID da categoria, ou lista |
category_tree | UUID da categoria e todas as subcategorias |
vendor_id | UUID do seller, ou lista |
without_vendor | true: só produtos da própria loja |
price_min, price_max | Faixa de preço em centavos |
list_price_min, list_price_max, cost_min, cost_max | O mesmo, para preço de lista e custo |
quantity_min, quantity_max | Faixa de estoque |
out_of_stock | true: estoque zero ou menor |
has_image, has_description, has_ean | false: só os produtos que não têm |
is_variation | true: só variações; false: só produtos principais |
free_shipping | true ou false |
sales_min, sales_max | Unidades vendidas (sales_max: 0 quer dizer nunca vendeu) |
created_after, created_before, updated_before | Datas, AAAA-MM-DD |
ids, exclude_ids | Incluir ou excluir ids específicos |
all | true: o catálogo inteiro. É a única forma de mandar um filtro sem outra chave. |
Várias chaves se combinam com E. Um filter vazio é recusado. Um filtro alcança no máximo 200.000 registros. Produtos excluídos nunca entram.
Simulação, token e desfazer
| Chamada | O que você recebe |
|---|---|
Ids + simulate: true nas rotas dedicadas e nas ações update_status, update_category, update_price, delete | Uma prévia, uma linha por id, sem token. |
filter + simulate: true (qualquer ação) | Total, amostra de 10 registros, confirm_token, expires_at, async. |
filter + confirm_token | Executa o lote. |
Ids, sem simulate e sem token | Executa na hora (é o que as telas do painel fazem). |
O confirm_token vale 70 minutos, é preso ao seu usuário, à rota e ao corpo exato (ação, parâmetros, filtro): mudou qualquer um, vem 409 confirm_token_invalid. Ele também falha se o filtro agora alcança mais registros do que a simulação aprovou.
Tarefas em segundo plano
Quando o lote alcança 50 registros ou mais (ou outro lote seu ainda está rodando) a chamada devolve 202 com uma tarefa (job). A tarefa tem status queued, running, done, failed ou interrupted, além de total, processed, affected, failed (uma contagem), percent e uma lista de até 50 falhas {id, error}. Consulte com GET /api/v1/admin/bulk-jobs/{id} a cada 2 segundos, ou acompanhe GET /api/v1/admin/bulk-jobs/{id}/stream (eventos do servidor: progress, depois done). O undo_id fica dentro de job.result.
Dinheiro e arquivos
- Lotes em JSON: preços em centavos, percentuais em pontos-base.
- Arquivos CSV/XLSX/XML: números decimais em reais (
49.90ou49,90). Na importação, um preço sem separador decimal é lido como centavos:4990é R$ 49,90, mas50é R$ 0,50. Escreva sempre duas casas (50.00). - Os CSV usam
;como separador e UTF-8 com BOM, para o Excel abrir direito.
Endpoints
Todas as rotas exigem o token Bearer de um usuário com o privilégio manage_catalog.
| Método | Rota | O que faz | Página |
|---|---|---|---|
| POST | /api/v1/admin/products/bulk | Lote unificado: status, exclusão, clone, categoria, preço, seller, edição de campos | Ações em lote |
| POST | /api/v1/admin/products/bulk/status | Mudança de status em lote | Rotas de lote dedicadas |
| POST | /api/v1/admin/products/bulk/delete | Exclusão em lote (lixeira) | Rotas de lote dedicadas |
| POST | /api/v1/admin/products/bulk/prices | Mudança de preço em lote | Rotas de lote dedicadas |
| POST | /api/v1/admin/products/bulk/move-category | Mudança de categoria em lote | Rotas de lote dedicadas |
| POST | /api/v1/admin/products/bulk/cells | Edição estilo planilha, até 200 linhas | Edição estilo planilha |
| POST | /api/v1/admin/products/import | Importa um arquivo CSV/XLSX em uma chamada | Importar um arquivo |
| GET | /api/v1/admin/products/import/template | Baixa o modelo CSV | Importar um arquivo |
| POST | /api/v1/admin/products/import/preview | Simulação de uma importação | Assistente de importação |
| POST | /api/v1/admin/products/import/validate | Recebe o arquivo e valida o mapeamento de colunas | Assistente de importação |
| POST | /api/v1/admin/products/import/execute | Executa a importação (segundo plano acima de 1000 linhas) | Assistente de importação |
| GET | /api/v1/admin/products/import/status/{id} | Progresso e resultado de uma importação | Assistente de importação |
| GET | /api/v1/admin/products/export | Baixa produtos em CSV, XLSX ou XLS | Exportar |
| POST | /api/v1/admin/products/export | Exporta colunas escolhidas com formato próprio | Exportar |
| POST | /api/v1/admin/products/export-xml | Exporta produtos em XML | Exportar |
| POST | /api/v1/admin/products/derive-hs-codes | Preenche códigos HS a partir do NCM | Manutenção |
| POST | /api/v1/admin/products/zero-quantities | Zera o estoque de todos os produtos | Manutenção |
Erros comuns
- Mandar
simulate: trueemcloneouupdate_vendorcom lista de ids. Essas duas ações ignoramsimulateno caminho por ids e executam de verdade. Para simulá-las, mande os ids como filtro:"filter": {"ids": ["..."]}. - Mandar um filtro e esquecer a simulação. Vem
428 simulate_required. Simule e repita com oconfirm_token. - Mudar qualquer coisa entre a simulação e a confirmação. O token é preso ao corpo exato:
409 confirm_token_invalid. - Percentual como 5 em vez de 500. Percentuais são pontos-base.
5significa 0,05%. - Ler
total_affected: 0numa simulação como "nada vai mudar". Nas simulações por ids ele é sempre0: conte as linhas depreview. - Preço
50num arquivo de importação. É R$ 0,50. Escreva50.00. - Esperar que o export-xml respeite
product_ids. Não respeita: ele exporta todo produto que casa com os filtros. Veja Exportar. - Tratar
200como "tudo mudou". Confiraaffectedefailedem toda resposta.