VenddorDocumentação API
API atualAPI legada
Guia rápidoReferência completa
Carregando índice…
API atual/Referência completa/Produtos do seller

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.

POST/api/v1/vendor/products/bulk/cellsSeller

Editar produtos como planilha

Cabeçalhos

Authorizationstringobrigatório
Bearer $TOKEN. Token de acesso do usuário seller (veja Tokens).

Corpo da requisição

updatesarrayobrigatório

Linhas a alterar, de 1 a 200.

product_idstring (uuid)obrigatório
Produto. Tem de ser do seu seller.
expected_updated_atstring
updated_at que você leu. Se o produto mudou desde então, a linha é recusada. Omita para forçar.
fieldsobjectobrigatório
Campos 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_undoboolean
true quando você reenvia os valores de previous para desfazer. Pula as checagens de faixa (valor negativo).
filterobject
Modo por critério: em vez de updates, descreva o recorte. Veja o aviso "Edição por filtro" abaixo.
changesarray
Modo por critério: transformações aplicadas a cada produto do recorte.
simulateboolean
Modo por critério: true só simula e devolve contagem, amostra e confirm_token.
confirm_tokenstring
Modo 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_requestedinteger
Linhas recebidas.
total_affectedinteger
Linhas gravadas.
resultsarray
Uma entrada por linha: product_id, ok e, se falhou, error.
previousarray
Valores anteriores das linhas gravadas, no mesmo formato de fields. Reenvie com is_undo: true para desfazer.

Erros

StatusQuandoCorpo
401Token ausente, inválido ou expirado.{"error":"missing authorization header"}
403Token que não é de seller, ou usuário sem o privilégio exigido pela rota.{"error":"insufficient vendor privileges","privilege_required_any":["vendor_catalog"]}
400updates ausente ou vazio, corpo inválido, ou mais de 200 linhas.{"error":"updates is required"}
403Algum product_id não é do seu seller ou não existe. Nada é gravado.{"error":"one or more products do not belong to this vendor"}
HTTP 200 não significa que tudo foi gravado

Falhas por linha voltam dentro de results com status 200. Confira ok de cada linha. Erros comuns: registro alterado por outro usuário (o expected_updated_at ficou velho), field price_cents: valor não pode ser negativo, no editable fields in payload, e product not found.

Edição por filtro

Em vez de listar ids, você pode mandar filter (por exemplo {"price_max":10000,"name_contains":"camiseta"}) e changes (por exemplo [{"field":"name","op":"append","value":" - PROMOÇÃO"}]). O recorte é sempre preso aos seus produtos. O fluxo tem duas etapas: primeiro chame com "simulate": true para receber total, uma amostra antes/depois e o confirm_token; depois repita o mesmo corpo com esse token para executar. Sem simulação a resposta é simulate_required. Lotes grandes viram uma tarefa em segundo plano (202), acompanhada em GET /api/v1/vendor/bulk-jobs/{id}. Chaves de filtro desconhecidas voltam invalid_filter com a lista das aceitas.

Concorrência

Sempre envie expected_updated_at com o updated_at que você leu. Assim você nunca sobrescreve uma alteração que outra pessoa ou outro sistema fez no meio do caminho.

Veja também

  • Produtos do seller: visão geral
  • Alterar produto
Anterior
Excluir produto
Próxima
Importar e exportar CSV
Nesta página
  • Exemplo de requisição
  • Resposta
  • Erros
  • Veja também