Assistente de importação
Importa produtos em quatro etapas (enviar, validar, executar, acompanhar), com mapeamento de colunas, opções e simulação sem gravar.
O assistente é a importação de produtos com controle. Em vez de depender do nome das colunas da planilha, você vê as colunas encontradas, escolhe para qual campo do produto cada uma vai, valida o resultado antes de gravar e só então executa. É o mesmo fluxo da tela de importação do painel.
Cada etapa é uma chamada. O job criado no envio (job_id) carrega o arquivo e liga as etapas entre si. Todas as rotas exigem o privilégio manage_catalog.
/api/v1/admin/advanced-import/uploadAdminEtapa 1: envia o arquivo e recebe as colunas
Lê o arquivo, detecta o separador, sugere o mapeamento de colunas e guarda tudo em um job. Nada é gravado no catálogo. Envie multipart/form-data.
Corpo da requisição (multipart/form-data)
filefileobrigatório.csv, .txt, .xml, .xlsx ou .xlsm.object_typestringpadrão: products/api/v1/admin/advanced-import/validateAdminEtapa 2: valida o mapeamento sem gravar
Aplica o mapeamento e as opções ao arquivo do job e conta o que aconteceria: quantos produtos seriam criados, atualizados ou pulados, e quais linhas têm erro. Não grava produtos.
Corpo da requisição (JSON)
job_iduuidobrigatóriojob_id do envio.field_mappingobjectobrigatório{"Código":"sku","Preço":"price"}. Não pode ser vazio. Os campos válidos estão em Campos importáveis e exportáveis.optionsobjectOpções da importação.
strategystringpadrão: import_allimport_allupdate_existingcreate_newimport_all cria e atualiza; update_existing só atualiza SKUs que já existem; create_new só cria.update_existingbooleanfalse, linhas cujo SKU já existe são puladas.skip_errorsbooleantrue, uma linha com erro é registrada e o resto continua. Quando false (ou omitido), a execução para na primeira linha com erro.default_vendor_iduuidvendor_id. A coluna da planilha vence quando preenchida.delimiterstringcreate_categoriesbooleantrue, os trechos de categoria que não existem são criados.category_delimiterstringpadrão: ///Moda///Camisetas).price_formatstringpadrão: autoautodecimalcentsdecimal são reais (49,90), cents são centavos inteiros (4990), auto decide pelo valor./api/v1/admin/advanced-import/executeAdminEtapa 3: executa a importação
Grava os produtos. Aceita as mesmas opções da validação mais as abaixo. Com até 1.000 linhas, roda dentro da requisição e responde com o resultado final (status completed). Com mais de 1.000, vira trabalho em segundo plano: a resposta é 200 com status processing e você acompanha na etapa 4.
Corpo da requisição (JSON)
job_iduuidobrigatóriojob_id do envio.field_mappingobjectobrigatóriooptionsobjectMesmas opções da validação, mais:
dry_runbooleanpadrão: falseset_zero_quantitiesbooleanpadrão: falsedata_modifiersarrayTransformações aplicadas ao valor de um campo antes de gravar.
field_keystringobrigatórioprice, name...).typestringobrigatóriononepercent_markuppercent_discountfixed_addfixed_subtractmultiplyroundtext_prefixtext_suffixtext_replaceset_valuepercent_markup, percent_discount, fixed_add, fixed_subtract, multiply, round) valem para preço e quantidade; as de texto (text_prefix, text_suffix, text_replace) para nome e descrição; set_value serve para qualquer campo.valuestringvalue2stringtext_replace./api/v1/admin/advanced-import/jobs/{id}AdminEtapa 4: consulta o job
Devolve o estado do job. É a mesma resposta de /import/jobs/{id}, então vale para ambas as famílias de rotas.
Parâmetros de caminho
iduuidobrigatóriojob_id.Exemplo de requisição
# 1) enviar
curl "$BASE_URL/api/v1/admin/advanced-import/upload" \
-H "Authorization: Bearer $TOKEN" -F "file=@erp.csv"
# 2) validar (use o job_id da resposta anterior)
curl "$BASE_URL/api/v1/admin/advanced-import/validate" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"job_id":"7aa94252-0df6-4293-8404-c0ffc2a96fbc",
"field_mapping":{"Código":"sku","Descrição":"name","Preço":"price","Saldo":"quantity","Fornecedor":"vendor_id"},
"options":{"strategy":"import_all","skip_errors":true,"price_format":"decimal"}}'
# 3) executar, com reajuste de 10% no preço
curl "$BASE_URL/api/v1/admin/advanced-import/execute" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"job_id":"7aa94252-0df6-4293-8404-c0ffc2a96fbc",
"field_mapping":{"Código":"sku","Descrição":"name","Preço":"price","Saldo":"quantity","Fornecedor":"vendor_id"},
"options":{"strategy":"import_all","skip_errors":true,"price_format":"decimal",
"data_modifiers":[{"field_key":"price","type":"percent_markup","value":"10"}]}}'Resposta
{
"job_id": "7aa94252-0df6-4293-8404-c0ffc2a96fbc",
"file_name": "erp.csv",
"total_rows": 2,
"csv_columns": ["product_code", "name", "price", "status", "quantity", "vendor_id"],
"detected_delimiter": ";",
"preview_rows": [
["DOCS-API-001", "Camiseta Docs Teste", "49,90", "A", "10", "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36"],
["DOCS-API-002", "", "19,90", "A", "5", ""]
],
"auto_mapping": { "name": "name", "price": "price", "product_code": "sku", "quantity": "quantity", "status": "status", "vendor_id": "vendor_id" },
"available_fields": [
{
"key": "basic",
"label": "Basic Information",
"label_pt": "Informacoes Basicas",
"fields": [
{ "key": "sku", "label": "SKU / Product Code", "label_pt": "Codigo do Produto", "group": "basic", "required": false, "db_column": "sku", "field_type": "string" }
]
}
]
}{
"job_id": "7aa94252-0df6-4293-8404-c0ffc2a96fbc",
"total_rows": 2,
"will_create": 1,
"will_update": 0,
"will_skip": 1,
"moderation_count": 0,
"errors": [
{
"row": 3,
"field": "vendor_id,name",
"message": "produto novo exige vendor_id, name — selecione o \"Vendedor padrão\" ou mapeie uma coluna para vendor_id"
}
],
"valid": false
}{
"job_id": "7aa94252-0df6-4293-8404-c0ffc2a96fbc",
"status": "completed",
"total_rows": 2,
"processed_rows": 0,
"created_count": 1,
"updated_count": 0,
"skipped_count": 1,
"moderation_count": 0,
"errors": [
{ "row": 3, "field": "vendor_id,name", "message": "produto novo exige vendor_id, name — selecione o \"Vendedor padrão\" antes de importar, ou mapeie uma coluna para vendor_id" }
],
"image_stored_count": 0,
"image_skipped_count": 0,
"image_failed_count": 0
}Campos da resposta (envio)
job_iduuidfile_namestringtotal_rowsintegercsv_columnsarraydetected_delimiterstring;, , ou tabulação).preview_rowsarraycsv_columns.auto_mappingobjectfield_mapping.available_fieldsarraybasic, pricing, inventory...). Cada campo tem key, label, label_pt, required, field_type e group.Campos da resposta (validação)
will_createintegerwill_updateintegerwill_skipintegermoderation_countintegererrorsarrayrow, field, message).warningsarrayvalidbooleantrue quando não há erro.fatalbooleantrue quando a execução não deve começar (por exemplo, linhas vazias no meio do arquivo). Só aparece quando verdadeiro.Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | file ausente no envio | {"error":"missing file field in form","detail":"http: no such file"} |
| 400 | job_id ausente | {"error":"job_id is required"} |
| 400 | field_mapping ausente ou vazio | {"error":"field_mapping is required"} |
| 400 | Corpo que não é JSON | {"error":"invalid request body","detail":"..."} |
| 400 | Arquivo vazio, linha em branco ou coluna obrigatória ausente | {"error":"csv_empty","detail":"uploaded file is empty"} |
| 401 | Token ausente ou expirado | {"error":"invalid or expired token"} |
| 403 | Falta manage_catalog | {"error":"insufficient privileges","required":"manage_catalog"} |
| 404 | GET de um job que não existe | {"error":"import job not found","detail":"import job not found: <id>"} |
| 415 | Extensão não aceita no envio | {"error":"unsupported file type","detail":"..."} |
| 500 | validate ou execute com um job_id que não existe | {"error":"validation failed","detail":"import job not found: <id>"} |