Assistente de importação
Pré-visualize uma importação sem gravar, mapeie as colunas do arquivo, rode importações grandes em segundo plano e consulte o progresso.
O assistente é o jeito cuidadoso de importar: você envia o arquivo, o servidor o lê, sugere qual coluna vai para qual campo do produto, diz o que criaria, atualizaria ou recusaria, e só então você executa. É o que a tela de importação do painel usa, e é a escolha certa para arquivos grandes (acima de 1000 linhas a execução vai para segundo plano), para arquivos com cabeçalhos diferentes dos nossos e sempre que você quiser ver o resultado antes de gravar.
- Pré-visualize ou valide
POST /products/import/preview(simulação pura) ouPOST /products/import/validate. Os dois recebem o seu arquivo e devolvem umjob_id, oauto_mappingsugerido (validate) e os problemas achados linha a linha. Nenhum produto é gravado. - Ajuste o mapeamento
Edite o mapeamento se preciso: é um objeto JSON
{"<cabeçalho da coluna no seu arquivo>": "<campo do produto>"}. - Execute
POST /products/import/executecom ojob_ide osfield_mappings(ou com o próprio arquivo). - Consulte o status
GET /products/import/status/{job_id}a cada 2 segundos até ostatussercompletedoufailed.
As quatro rotas exigem o privilégio manage_catalog e os mesmos formatos de Importar um arquivo: CSV (; ou ,), .txt, .xlsx/.xlsm (primeira planilha). Os preços seguem a mesma regra: com separador decimal são reais, sem ele são centavos.
Pré-visualizar (simulação)
/api/v1/admin/products/import/previewAdminSimulação de uma importação
Roda toda a validação das linhas e não grava nada. O arquivo recebido fica disponível sob o job_id devolvido.
Corpo da requisição (multipart/form-data)
filefileobrigatóriofield_mappingsstring{"coluna": "campo"}. Se omitido, usa-se o mapeamento automático.strategystringpadrão: create_updatecreate_updateupsertupdate_onlycreate_onlydefault_vendor_iduuidcurl -X POST "$BASE_URL/api/v1/admin/products/import/preview" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@produtos.csv" -F "strategy=create_update" \
-F "default_vendor_id=9d9d9d56-eb43-4719-889d-055632f7c7da"{
"job_id": "51d36ba6-c07d-4693-b316-f50f3ec8c281",
"total_rows": 3,
"would_create": 1,
"would_update": 1,
"would_skip": 1,
"errors_by_row": [
{ "row": 4, "field": "name", "message": "produto novo exige name" }
],
"preview_rows": [
{ "row_number": 2, "action": "update", "data": { "sku": "CAM-001", "name": "Camiseta Azul", "price": "59,90", "quantity": "11" } },
{ "row_number": 3, "action": "create", "data": { "sku": "GAR-004", "name": "Garrafa", "price": "19,90", "quantity": "3" } },
{ "row_number": 4, "action": "error", "data": { "sku": "XXX-005", "name": "", "price": "10,00" }, "error": "produto novo exige name" }
],
"valid": false
}Campos da resposta
job_iduuidtotal_rowsintegerwould_createintegerwould_updateintegerwould_skipintegererrors_by_rowarrayrow (o cabeçalho é a linha 1), field, message. As mensagens vêm em português.preview_rowsarrayrow_number, action (create, update, skip, error), data (os valores por campo do produto) e error.validbooleantrue quando nenhuma linha tem erro.Validar e sugerir o mapeamento
/api/v1/admin/products/import/validateAdminReceber o arquivo e validar o mapeamento
Como o preview, e devolve também o que o assistente precisa para desenhar a etapa de mapeamento: as colunas do arquivo, o mapeamento automático e os campos disponíveis. Os mesmos campos de formulário do preview.
Corpo da requisição (multipart/form-data)
filefileobrigatóriofield_mappingsstring{"coluna": "campo"}. Vazio significa mapeamento automático.strategystringpadrão: create_updatecreate_updateupsertupdate_onlycreate_onlydefault_vendor_iduuidcurl -X POST "$BASE_URL/api/v1/admin/products/import/validate" \
-H "Authorization: Bearer $TOKEN" -F "file=@produtos.csv"{
"job_id": "2fead437-b344-4fcc-ab4e-d228141e03ad",
"total": 3,
"will_create": 1,
"will_update": 1,
"errors": 1,
"under_moderation": 0,
"valid": false,
"auto_mapping": { "sku": "sku", "name": "name", "price": "price", "quantity": "quantity", "status": "status", "category_id": "category_id", "vendor_id": "vendor_id" },
"csv_columns": ["sku", "name", "price", "quantity", "status", "category_id", "vendor_id"],
"rows": [
{ "row_number": 2, "action": "create", "data": { "sku": "CAM-001", "name": "Camiseta Azul", "price": "59,90" } },
{ "row_number": 4, "action": "error", "data": { "sku": "XXX-005", "name": "" }, "error": "produto novo exige name" }
],
"available_fields": [
{ "key": "basic", "label": "Basic Information", "label_pt": "Informacoes Basicas", "fields": [{ "key": "sku", "label": "SKU / Product Code", "required": false, "field_type": "string" }] }
]
}Campos da resposta
job_iduuidtotalintegerwill_createintegerwill_updateintegererrorsintegerunder_moderationintegervalidbooleantrue quando não há erros.auto_mappingobject{"coluna": "campo"}.csv_columnsarrayrowsarrayrow_number, action e data. Aqui action é só create ou error, mesmo para linhas que atualizariam; use will_update para a contagem.available_fieldsarraykey, label, label_pt e fields.Executar
/api/v1/admin/products/import/executeAdminExecutar a importação recebida
Duas formas de chamar:
- Com
job_id(do preview ou do validate): executa aquele arquivo, de forma síncrona, qualquer que seja o tamanho. Você precisa mandarfield_mappings(use oauto_mappingdevolvido pelo validate). Sem mapeamento todas as linhas são puladas. - Com
file(semjob_id): recebe e executa numa só chamada. Semfield_mappingsusa-se o mapeamento automático. Acima de 1000 linhas a importação roda em segundo plano e a resposta vem na hora comstatus: "processing"; consulte a rota de status.
Corpo da requisição (multipart/form-data)
job_iduuidfilefilejob_id.field_mappingsstring{"coluna": "campo"}.strategystringpadrão: create_updatecreate_updateupdate_onlycreate_onlydefault_vendor_iduuidtest_modestringtruetrue nada é gravado: age como o validate e precisa do arquivo.curl -X POST "$BASE_URL/api/v1/admin/products/import/execute" \
-H "Authorization: Bearer $TOKEN" \
-F "job_id=2fead437-b344-4fcc-ab4e-d228141e03ad" \
-F 'field_mappings={"sku":"sku","name":"name","price":"price","vendor_id":"vendor_id"}' \
-F "strategy=create_update"{
"job_id": "af361351-ce28-44ef-b389-9cac3a7bac26",
"status": "completed",
"total_rows": 3,
"processed_rows": 2,
"created_count": 1,
"updated_count": 1,
"skipped_count": 1,
"moderation_count": 0,
"errors": [{ "row": 4, "field": "name", "message": "produto novo exige name" }],
"image_stored_count": 0,
"image_skipped_count": 0,
"image_failed_count": 0
}{
"job_id": "af361351-ce28-44ef-b389-9cac3a7bac26",
"status": "processing",
"total_rows": 5400,
"processed_rows": 0,
"created_count": 0,
"updated_count": 0,
"skipped_count": 0,
"moderation_count": 0,
"image_stored_count": 0,
"image_skipped_count": 0,
"image_failed_count": 0
}Consultar o status
/api/v1/admin/products/import/status/{id}AdminProgresso e resultado de uma importação
Parâmetros de caminho
iduuidobrigatóriojob_id devolvido pelo preview, validate ou execute.curl "$BASE_URL/api/v1/admin/products/import/status/af361351-ce28-44ef-b389-9cac3a7bac26" \
-H "Authorization: Bearer $TOKEN"A resposta tem o mesmo formato da resposta do execute.
Campos da resposta (execute e status)
job_iduuidstatusstringpendingprocessingcompletedfailedpending recebida e não iniciada, processing rodando, completed concluída, failed interrompida por erro fatal.total_rowsintegerprocessed_rowsintegercreated_countintegerupdated_countintegerskipped_countintegermoderation_countintegererrorsarray{row, field, message}. Omitido quando vazio.warningsarrayimage_stored_countintegerimage_skipped_countintegerimage_failed_countintegerErros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 400 | Não é multipart, ou sem file (e sem job_id) | {"error":"missing file field in form","detail":"..."} |
| 400 | field_mappings não é JSON válido | {"error":"invalid field_mappings JSON","detail":"..."} |
| 400 | Arquivo vazio ou planilha malformada | {"error":"csv_empty","detail":"uploaded file is empty"} |
| 401 / 403 | Sem token / sem manage_catalog | {"error":"missing authorization header"} / {"error":"insufficient privileges","required":"manage_catalog"} |
| 404 | Status de uma tarefa desconhecida | {"error":"import job not found","detail":"import job not found: 000..."} |
| 415 | Extensão não aceita | {"error":"unsupported file type","detail":"only CSV, XLSX and XML files are accepted (got \".pdf\")"} |
| 500 | O arquivo não pôde ser lido ou recebido, ou a importação falhou | {"error":"import execution failed","detail":"..."} |