Itens da tabela de preço
Lista, grava em lote, exporta e importa por CSV as linhas de preço (produto, quantidade mínima, preço fixo ou desconto) de uma tabela.
Os itens são as linhas da tabela: cada uma liga um produto a uma quantidade mínima (min_qty) e a um de dois valores, price_cents (preço unitário fixo, em centavos) ou discount_bps (desconto sobre o preço base, em pontos-base: 600 = 6%). A chave de uma linha é o par produto e min_qty, então um produto pode ter degraus: min_qty 1 a R$ 50,00, min_qty 10 a R$ 45,00 e assim por diante.
Para poucas linhas use PUT /items (JSON). Para catálogo grande use import (CSV). Todas as rotas exigem o módulo b2b-pricing e o privilégio manage_b2b ou manage_promotions.
Listar itens
Devolve as linhas da tabela, ordenadas por nome do produto e min_qty, com nome e SKU do produto para exibição.
/api/v1/admin/b2b/price-lists/{id}/itemsAdminLista os itens de uma tabela
Parâmetros de caminho
iduuidobrigatórioParâmetros de consulta
qstringpageintegerpadrão: 1per_pageintegerpadrão: 50Exemplo de requisição
curl "$BASE_URL/api/v1/admin/b2b/price-lists/3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/items?q=mesa&per_page=50" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"items": [
{
"id": "91418c7f-7dae-42a9-8d3a-1bb52e6ed16e",
"price_list_id": "3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"product_id": "5b6f1948-356b-4739-adfc-af8045b7b769",
"product_name": "Mesa Plus Cinza",
"sku": "SD-004487",
"min_qty": 1,
"price_cents": 26250
}
],
"total": 1
}Campos da resposta
itemsarraytotalintegerq, em todas as páginas.iduuidproduct_iduuidproduct_namestringskustringmin_qtyintegerprice_centsintegerdiscount_bpsintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 500 | Id que não é UUID ou falha de consulta | {"error":"failed to list items","detail":"..."} |
A rota não confere se a tabela existe: um UUID válido inexistente devolve {"items":[],"total":0}.
Gravar itens em lote
Cria ou atualiza várias linhas de uma vez. A chave é product_id mais min_qty: se a linha existe, o preço ou desconto é substituído; se não, é criada. O lote é tudo ou nada, numa transação.
/api/v1/admin/b2b/price-lists/{id}/itemsAdminCria ou atualiza itens em lote
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
itemsarrayobrigatórioLinhas a gravar.
product_iduuidobrigatóriomin_qtyintegerobrigatórioprice_centsintegerdiscount_bps.discount_bpsintegerprice_cents.Exemplo de requisição
curl -X PUT "$BASE_URL/api/v1/admin/b2b/price-lists/3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/items" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "product_id": "5b6f1948-356b-4739-adfc-af8045b7b769", "min_qty": 1, "price_cents": 26250 },
{ "product_id": "5b6f1948-356b-4739-adfc-af8045b7b769", "min_qty": 10, "discount_bps": 800 }
]
}'Resposta
{ "upserted": 2 }Campos da resposta
upsertedintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"invalid request body","detail":"..."} |
| 422 | Linha sem preço nem desconto, com os dois, com desconto fora de 1 a 10000, preço negativo ou min_qty menor que 1 | {"error":"failed to upsert items","detail":"item 0 (<product_id>): exactly one of price_cents or discount_bps must be set"} |
| 422 | Produto ou tabela inexistente | {"error":"failed to upsert items","detail":"upsert item <product_id>: ..."} |
Exportar itens em CSV
Baixa todas as linhas da tabela como arquivo CSV, ordenado por SKU. É o formato que a importação lê de volta, então serve para editar numa planilha e reimportar.
/api/v1/admin/b2b/price-lists/{id}/exportAdminExporta os itens em CSV
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl -o tabela.csv "$BASE_URL/api/v1/admin/b2b/price-lists/3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/export" \
-H "Authorization: Bearer $TOKEN"Resposta
sku;min_qty;price;discount_percent
SD-004487;1;262,50;
SD-004487;10;;8O arquivo é UTF-8 com BOM (abre direto no Excel em português), separado por ponto e vírgula, com Content-Type: text/csv; charset=utf-8 e Content-Disposition: attachment. A coluna price vem em reais com vírgula (262,50, sem separador de milhar) e discount_percent em porcentagem (8, 12,5). Em cada linha só uma das duas colunas vem preenchida.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 404 | UUID válido que não existe | {"error":"price list not found"} |
| 500 | Id que não é UUID | {"error":"price list operation failed","detail":"..."} |
Importar itens de um CSV
Envia um arquivo e a plataforma processa em segundo plano: a rota responde 202 na hora com um job_id. Importar milhares de linhas leva mais que o limite de uma requisição, por isso nunca é síncrono.
/api/v1/admin/b2b/price-lists/{id}/importAdminImporta itens de um CSV
Parâmetros de caminho
iduuidobrigatórioParâmetros de consulta
modestringpadrão: mergemergereplacemerge grava por cima (atualiza o que existe, cria o que falta, mantém o resto). replace apaga todos os itens da tabela antes de gravar o arquivo. Qualquer outro valor vira merge.Corpo da requisição (multipart/form-data)
filefileobrigatório; ou ,) é detectado pelo cabeçalho.O CSV precisa ter cabeçalho com as colunas (sem diferenciar maiúsculas):
| Coluna | Obrigatória | Conteúdo |
|---|---|---|
sku | Sim | SKU de um produto ativo. |
min_qty | Sim | Inteiro, 1 ou mais. |
price | Uma das duas | Preço em reais no formato brasileiro: 1.234,56, 262,50, 99. Aceita R$ na frente. |
discount_percent | Uma das duas | Porcentagem maior que 0 e até 100: 8, 12,5, 10%. |
Use ou price ou discount_percent como coluna no arquivo inteiro. Ter as duas colunas é recusado.
Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/b2b/price-lists/3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/import?mode=merge" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@tabela.csv;type=text/csv"Resposta
{ "job_id": "c8a1f0d2-4b7e-4f93-a6d5-0e2b9c1d7a33", "status": "processing" }Acompanhe o andamento em GET /api/v1/admin/import/jobs/{job_id}. O trabalho passa por processing e termina em completed ou failed. Em completed, created_count traz as linhas gravadas e skipped_count as linhas recusadas, cada uma descrita em errors (número da linha e motivo, por exemplo sku "ABC-1" not found or inactive). Uma linha ruim não derruba as outras: a importação é parcial.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Formulário inválido ou sem o campo file | {"error":"missing file","detail":"..."} |
| 404 | Tabela inexistente | {"error":"price list not found"} |
| 409 | Já há uma importação rodando nesta tabela | {"error":"import already running","detail":"another import is already running for this price list"} |
| 422 | Arquivo vazio, sem sku ou min_qty, sem coluna de valor, com as duas colunas de valor | {"error":"invalid CSV","detail":"missing required columns: sku and min_qty"} |
| 500 | Falha ao enfileirar | {"error":"failed to start import","detail":"..."} |