Modo planilha
Altera campos de até 200 produtos numa chamada só, como edição de planilha, com versão por linha e desfazer.
É a rota da grade editável do painel: o seller altera preço, estoque, EAN ou status de muitos produtos de uma vez. Cada linha é gravada em separado e tem resultado próprio. O lote inteiro só é recusado se alguma linha apontar para produto que não é seu.
/api/v1/vendor/products/bulk/cellsSellerEditar produtos como planilha
Cabeçalhos
AuthorizationstringobrigatórioBearer $TOKEN. Token de acesso do usuário seller (veja Tokens).Corpo da requisição
updatesarrayobrigatórioLinhas a alterar, de 1 a 200.
product_idstring (uuid)obrigatórioProduto. Tem de ser do seu seller.
expected_updated_atstringupdated_at que você leu. Se o produto mudou desde então, a linha é recusada. Omita para forçar.fieldsobjectobrigatórioCampos a gravar. Chaves aceitas:
name, sku, ean, brand, price_cents, list_price_cents, quantity, weight, length, width, height, status, seo_title, seo_description. Outras chaves são ignoradas. Valores monetários são centavos inteiros e quantity aceita só inteiros; null limpa o campo.is_undobooleantrue quando você reenvia os valores de previous para desfazer. Pula as checagens de faixa (valor negativo).filterobjectModo por critério: em vez de
updates, descreva o recorte. Veja o aviso "Edição por filtro" abaixo.changesarrayModo por critério: transformações aplicadas a cada produto do recorte.
simulatebooleanModo por critério:
true só simula e devolve contagem, amostra e confirm_token.confirm_tokenstringModo por critério: token da simulação, exigido para executar.
Exemplo de requisição
bash
curl -X POST "$BASE_URL/api/v1/vendor/products/bulk/cells" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"updates": [
{
"product_id": "7bc1d5e9-a9a4-457b-866f-bbb3879d258d",
"expected_updated_at": "2026-10-11T21:05:40.573283Z",
"fields": {
"price_cents": 4590,
"quantity": 40
}
},
{
"product_id": "0d6c7b0e-3f55-4d2c-9f0e-1d3b6d1f6a10",
"fields": {
"ean": "7891234567895",
"status": "H"
}
}
]
}'Resposta
200Resultado por linha
json
{
"total_requested": 2,
"total_affected": 1,
"results": [
{
"product_id": "7bc1d5e9-a9a4-457b-866f-bbb3879d258d",
"ok": true
},
{
"product_id": "0d6c7b0e-3f55-4d2c-9f0e-1d3b6d1f6a10",
"ok": false,
"error": "registro alterado por outro usuário"
}
],
"previous": [
{
"product_id": "7bc1d5e9-a9a4-457b-866f-bbb3879d258d",
"fields": {
"price_cents": 4990,
"quantity": 25
}
}
]
}Campos da resposta
total_requestedintegerLinhas recebidas.
total_affectedintegerLinhas gravadas.
resultsarrayUma entrada por linha:
product_id, ok e, se falhou, error.previousarrayValores anteriores das linhas gravadas, no mesmo formato de
fields. Reenvie com is_undo: true para desfazer.Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | Token que não é de seller, ou usuário sem o privilégio exigido pela rota. | {"error":"insufficient vendor privileges","privilege_required_any":["vendor_catalog"]} |
| 400 | updates ausente ou vazio, corpo inválido, ou mais de 200 linhas. | {"error":"updates is required"} |
| 403 | Algum product_id não é do seu seller ou não existe. Nada é gravado. | {"error":"one or more products do not belong to this vendor"} |