API de Produtos
CRUD completo de produtos via API. Liste, consulte, crie, atualize e exclua produtos programaticamente.
Gerencie o cadastro de produtos do Bunto ERP. Este endpoint permite listar, consultar, criar, atualizar e excluir produtos da sua empresa via API.
Base URL
Produção:
https://api-backend.bunto.com.br/v1/produtos/
Autenticação
Todas as requisições exigem um Token de API no header Authorization:
Authorization: Bearer bnt_seu_token_aqui
Tokens são gerados em Integrações -> Tokens de API no painel do Bunto ERP. Escopo necessário: produtos com a ação correspondente (read, write ou delete).
Endpoints
Listar Produtos
GET /v1/produtos/
Escopo necessário: produtos: read
Retorna a lista paginada de produtos ativos da empresa.
Query Parameters
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
pagina | integer | 1 | Número da página |
por_pagina | integer | 25 | Registros por página (máximo: 100) |
busca | string | - | Busca por nome, código ou GTIN |
situacao | string | - | Filtrar por situação: A (ativo), I (inativo), E (excluído) |
formato | string | - | Filtrar por formato: S (simples), K (kit), V (variações), F (fabricado), M (matéria-prima) |
categoria_id | integer | - | Filtrar por ID da categoria |
ordenar | string | nome | Campo de ordenação: nome, codigo, preco, criado_em, atualizado_em |
direcao | string | asc | Direção da ordenação: asc ou desc |
Exemplo com cURL
bashcurl 'https://api-backend.bunto.com.br/v1/produtos/?pagina=1&por_pagina=10&busca=camiseta&ordenar=preco&direcao=desc' \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json'
Exemplo com Python
pythonimport requests BASE_URL = "https://api-backend.bunto.com.br/v1" TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4" headers = { "Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json", } # Listar produtos com filtros resposta = requests.get( f"{BASE_URL}/produtos/", headers=headers, params={ "pagina": 1, "por_pagina": 25, "situacao":"A", "ordenar": "nome", "direcao": "asc", }, ) dados = resposta.json() if dados["success"]: produtos = dados["data"]["resultados"] paginacao = dados["data"]["paginacao"] print(f"Total de produtos: {paginacao['total_registros']}") for produto in produtos: print(f" - [{produto['codigo']}] {produto['nome']} - R$ {produto['preco']}") else: print(f"Erro: {resposta.status_code}")
Exemplo com JavaScript
javascriptconst BASE_URL = "https://api-backend.bunto.com.br/v1"; const TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4"; const params = new URLSearchParams({ pagina: "1", por_pagina: "25", situacao: "A", ordenar: "nome", direcao: "asc", }); const resposta = await fetch(`${BASE_URL}/produtos/?${params}`, { headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }, }); const dados = await resposta.json(); if (dados.success) { const produtos = dados.data.resultados; const paginacao = dados.data.paginacao; console.log(`Total de produtos: ${paginacao.total_registros}`); produtos.forEach((produto) => { console.log(` - [${produto.codigo}] ${produto.nome} - R$ ${produto.preco}`); }); } else { console.error(`Erro: ${resposta.status}`); }
Resposta (200 OK)
json{ "success": true, "message": "142 registros encontrados", "data": { "resultados": [ { "id": 1, "nome": "Camiseta Basica Algodão", "codigo":"CAM-001", "gtin": "7891234560012", "unidade": "UN", "marca": "Hering", "preco":"49.9000000000", "preco_custo": "22.5000000000", "preco_promocional": null, "formato": "S", "situacao":"A", "controlar_estoque": true, "ativo": true, "categoria_nome": "Vestuário", "criado_em": "2026-01-15T10:30:00-03:00", "atualizado_em": "2026-02-10T14:22:00-03:00" }, { "id": 2, "nome": "Bermuda Jeans Masculina", "codigo":"BER-002", "gtin": "7891234560029", "unidade": "UN", "marca": "Colcci", "preco":"129.9000000000", "preco_custo": "65.0000000000", "preco_promocional": "99.9000000000", "formato": "V", "situacao":"A", "controlar_estoque": true, "ativo": true, "categoria_nome": "Vestuário", "criado_em": "2026-01-20T09:15:00-03:00", "atualizado_em": "2026-02-11T08:45:00-03:00" } ], "paginacao": { "pagina_atual": 1, "total_paginas": 6, "total_registros": 142, "por_pagina": 25, "proxima": "https://api-backend.bunto.com.br/v1/produtos/?pagina=2", "anterior": null } } }
Campos da Listagem
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | Identificador único do produto |
nome | string | Nome do produto |
codigo | string | Código (SKU) do produto |
gtin | string / null | Código GTIN/EAN (até 14 dígitos) |
unidade | string | Unidade de medida (UN, KG, L, PC, CX, etc.) |
marca | string / null | Marca do produto |
preco | decimal | Preço de venda |
preco_custo | decimal / null | Preço de custo |
preco_promocional | decimal / null | Preço promocional (quando aplicável) |
formato | string | Formato: S (simples), K (kit), V (variações), F (fabricado), M (matéria-prima) |
situacao | string | Situação: A (ativo), I (inativo), E (excluído) |
controlar_estoque | boolean | Se o estoque do produto é controlado |
ativo | boolean | Se o produto está ativo no sistema |
categoria_nome | string / null | Nome da categoria associada |
criado_em | datetime | Data e hora de criação |
atualizado_em | datetime | Data e hora da última atualização |
Obter Produto
GET /v1/produtos/{id}/
Escopo necessário: produtos: read
Retorna os dados completos de um produto específico, incluindo dimensões, dados fiscais e estoque.
Exemplo com cURL
bashcurl https://api-backend.bunto.com.br/v1/produtos/1/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json'
Exemplo com Python
pythonimport requests BASE_URL = "https://api-backend.bunto.com.br/v1" TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4" headers = { "Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json", } produto_id = 1 resposta = requests.get(f"{BASE_URL}/produtos/{produto_id}/", headers=headers) dados = resposta.json() if dados["success"]: produto = dados["data"] print(f"Produto: {produto['nome']}") print(f"Preco: R$ {produto['preco']}") print(f"Estoque: {produto['estoque_total']}") if produto["fiscal"]: print(f"NCM: {produto['fiscal']['ncm']}") else: print(f"Erro: {dados}")
Exemplo com JavaScript
javascriptconst BASE_URL = "https://api-backend.bunto.com.br/v1"; const TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4"; const produtoId = 1; const resposta = await fetch(`${BASE_URL}/produtos/${produtoId}/`, { headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }, }); const dados = await resposta.json(); if (dados.success) { const produto = dados.data; console.log(`Produto: ${produto.nome}`); console.log(`Preco: R$ ${produto.preco}`); console.log(`Estoque: ${produto.estoque_total}`); if (produto.fiscal) { console.log(`NCM: ${produto.fiscal.ncm}`); } } else { console.error(`Erro: ${JSON.stringify(dados)}`); }
Resposta (200 OK)
json{ "success": true, "message": "Registro encontrado", "data": { "id": 1, "nome": "Camiseta Basica Algodão", "codigo":"CAM-001", "gtin": "7891234560012", "unidade": "UN", "marca": "Hering", "preco":"49.9000000000", "preco_custo": "22.5000000000", "preco_promocional": null, "formato": "S", "situacao":"A", "controlar_estoque": true, "ativo": true, "categoria_nome": "Vestuário", "criado_em": "2026-01-15T10:30:00-03:00", "atualizado_em": "2026-02-10T14:22:00-03:00", "fantasia": "Camiseta Basica Algodão", "descricao_curta": "Camiseta basica 100% algodão, confortável para uso diário.", "descricao_complementar": "Tecido penteado 30.1, costura reforçada, etiqueta interna em serigrafia.", "observacoes":null, "condicao": "1", "tipo_producao": "P", "markup": "1.2178", "peso_liquido": "0.180", "peso_bruto": "0.220", "largura": "30.000", "altura": "2.000", "profundidade": "25.000", "estoque_total": "154", "fiscal": { "ncm": "61051000", "cest": "2800100", "origem": "0", "tipo_item_sped": "00", "gtin_tributario": null } } }
Campos do Detalhe (adicionais à listagem)
| Campo | Tipo | Descrição |
|---|---|---|
fantasia | string | Nome fantasia (mesmo que nome quando não definido) |
descricao_curta | string / null | Descrição curta do produto |
descricao_complementar | string / null | Descrição complementar detalhada |
observacoes | string / null | Observações internas |
condicao | string | Condição: 0 (não especificado), 1 (novo), 2 (usado), 3 (recondicionado) |
tipo_producao | string / null | Tipo: P (própria), T (terceiros) |
markup | decimal / null | Percentual de markup sobre o preço de custo |
peso_liquido | decimal / null | Peso líquido em kg |
peso_bruto | decimal / null | Peso bruto em kg |
largura | decimal / null | Largura em cm |
altura | decimal / null | Altura em cm |
profundidade | decimal / null | Profundidade em cm |
estoque_total | string | Quantidade total em estoque (calculado via lançamentos) |
fiscal | object / null | Dados fiscais do produto (veja tabela abaixo) |
Objeto fiscal
| Campo | Tipo | Descrição |
|---|---|---|
ncm | string / null | Nomenclatura Comum do Mercosul (até 8 dígitos) |
cest | string / null | Código Especificador de Substituição Tributária (até 7 dígitos) |
origem | string / null | Origem da mercadoria (0-8, conforme tabela ICMS) |
tipo_item_sped | string / null | Tipo do item SPED: 00 (revenda), 01 (matéria-prima), 04 (acabado), etc. |
gtin_tributario | string / null | GTIN/EAN tributário |
Criar Produto
POST /v1/produtos/
Escopo necessário: produtos: write
Cria um novo produto na empresa do token autenticado.
Campos do Request Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome | string | Sim | Nome do produto (máximo 200 caracteres) |
codigo | string | Não | Código (SKU) do produto (máximo 60 caracteres) |
gtin | string | Não | Código GTIN/EAN (máximo 14 caracteres) |
gtin_tributario | string | Não | GTIN/EAN tributário (máximo 14 caracteres) |
unidade | string | Não | Unidade de medida (padrão: UN, máximo 10 caracteres) |
marca | string | Não | Marca (máximo 45 caracteres) |
preco | decimal | Não | Preço de venda (padrão: 0) |
preco_custo | decimal | Não | Preço de custo |
preco_promocional | decimal | Não | Preço promocional |
markup | decimal | Não | Percentual de markup |
formato | string | Não | Formato: S (simples, padrão), K (kit), V (variações), F (fabricado), M (matéria-prima) |
situacao | string | Não | Situação: A (ativo, padrão), I (inativo) |
condicao | string | Não | Condição: 0 (não especificado, padrão), 1 (novo), 2 (usado), 3 (recondicionado) |
tipo_producao | string | Não | Tipo: P (própria), T (terceiros) |
frete_gratis | string | Não | Frete grátis: 0 (não, padrão), 1 (sim) |
controlar_estoque | boolean | Não | Controlar estoque (padrão: false) |
controlar_lotes | boolean | Não | Controlar lotes (padrão: false) |
descricao_curta | string | Não | Descrição curta |
descricao_complementar | string | Não | Descrição complementar detalhada |
observacoes | string | Não | Observações internas |
peso_liquido | decimal | Não | Peso líquido em kg |
peso_bruto | decimal | Não | Peso bruto em kg |
largura | decimal | Não | Largura em cm |
altura | decimal | Não | Altura em cm |
profundidade | decimal | Não | Profundidade em cm |
volumes | integer | Não | Número de volumes |
itens_por_caixa | integer | Não | Itens por caixa |
garantia_meses | integer | Não | Garantia em meses |
dias_preparacao | integer | Não | Dias para disponibilizar o produto |
crossdocking | integer | Não | Prazo de crossdocking |
localizacao | string | Não | Localização no depósito (máximo 50 caracteres) |
link_externo | string (URL) | Não | Link externo do produto |
video | string (URL) | Não | URL do vídeo do produto |
data_validade | date | Não | Data de validade (formato: YYYY-MM-DD) |
categoria_id | integer | Não | ID da categoria |
Exemplo com cURL
bashcurl -X POST https://api-backend.bunto.com.br/v1/produtos/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json' \ -d '{ "nome": "Tênis Esportivo Running Pro", "codigo":"TEN-045", "gtin": "7891234560098", "unidade": "PAR", "marca": "Olympikus", "preco":299.90, "preco_custo": 145.00, "formato": "S", "situacao":"A", "condicao": "1", "controlar_estoque": true, "descricao_curta": "Tênis esportivo para corrida com amortecimento em gel.", "peso_liquido": 0.320, "peso_bruto": 0.580, "largura": 35.0, "altura": 15.0, "profundidade": 12.0, "garantia_meses": 3, "categoria_id": 5 }'
Exemplo com Python
pythonimport requests BASE_URL = "https://api-backend.bunto.com.br/v1" TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4" headers = { "Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json", } novo_produto = { "nome": "Tênis Esportivo Running Pro", "codigo":"TEN-045", "gtin": "7891234560098", "unidade": "PAR", "marca": "Olympikus", "preco":299.90, "preco_custo": 145.00, "formato": "S", "situacao":"A", "condicao": "1", "controlar_estoque": True, "descricao_curta": "Tênis esportivo para corrida com amortecimento em gel.", "peso_liquido": 0.320, "peso_bruto": 0.580, "largura": 35.0, "altura": 15.0, "profundidade": 12.0, "garantia_meses": 3, "categoria_id": 5, } resposta = requests.post(f"{BASE_URL}/produtos/", headers=headers, json=novo_produto) dados = resposta.json() if dados["success"]: produto = dados["data"] print(f"Produto criado com sucesso! ID: {produto['id']}") print(f"Nome: {produto['nome']}") else: print(f"Erro ao criar produto: {dados}")
Exemplo com JavaScript
javascriptconst BASE_URL = "https://api-backend.bunto.com.br/v1"; const TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4"; const novoProduto = { nome: "Tênis Esportivo Running Pro", codigo: "TEN-045", gtin: "7891234560098", unidade: "PAR", marca: "Olympikus", preco: 299.9, preco_custo: 145.0, formato: "S", situacao: "A", condicao: "1", controlar_estoque: true, descricao_curta: "Tênis esportivo para corrida com amortecimento em gel.", peso_liquido: 0.32, peso_bruto: 0.58, largura: 35.0, altura: 15.0, profundidade: 12.0, garantia_meses: 3, categoria_id: 5, }; const resposta = await fetch(`${BASE_URL}/produtos/`, { method: "POST", headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify(novoProduto), }); const dados = await resposta.json(); if (dados.success) { console.log(`Produto criado com sucesso! ID: ${dados.data.id}`); console.log(`Nome: ${dados.data.nome}`); } else { console.error(`Erro ao criar produto:`, dados); }
Resposta (201 Created)
json{ "success": true, "message": "Produto criado com sucesso", "data": { "id": 143, "nome": "Tênis Esportivo Running Pro", "codigo":"TEN-045", "gtin": "7891234560098", "unidade": "PAR", "marca": "Olympikus", "preco":"299.9000000000", "preco_custo": "145.0000000000", "preco_promocional": null, "formato": "S", "situacao":"A", "controlar_estoque": true, "ativo": true, "categoria_nome": "Calçados", "criado_em": "2026-02-12T15:30:00-03:00", "atualizado_em": "2026-02-12T15:30:00-03:00", "fantasia": "Tênis Esportivo Running Pro", "descricao_curta": "Tênis esportivo para corrida com amortecimento em gel.", "descricao_complementar": null, "observacoes":null, "condicao": "1", "tipo_producao": null, "markup": null, "peso_liquido": "0.320", "peso_bruto": "0.580", "largura": "35.000", "altura": "15.000", "profundidade": "12.000", "estoque_total": "0", "fiscal": null } }
Atualizar Produto
PUT /v1/produtos/{id}/
PATCH /v1/produtos/{id}/
Escopo necessário: produtos: write
Atualiza um produto existente. Use PUT para atualização completa ou PATCH para atualização parcial (apenas os campos enviados serão alterados).
Exemplo com cURL (PATCH - atualização parcial)
bashcurl -X PATCH https://api-backend.bunto.com.br/v1/produtos/143/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json' \ -d '{ "preco":279.90, "preco_promocional": 249.90, "descricao_curta": "Tênis esportivo para corrida com amortecimento em gel e solado antiderrapante." }'
Exemplo com Python
pythonimport requests BASE_URL = "https://api-backend.bunto.com.br/v1" TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4" headers = { "Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json", } produto_id = 143 # Atualizacao parcial (PATCH) - apenas os campos que mudaram atualizacao = { "preco":279.90, "preco_promocional": 249.90, "descricao_curta": "Tênis esportivo para corrida com amortecimento em gel e solado antiderrapante.", } resposta = requests.patch( f"{BASE_URL}/produtos/{produto_id}/", headers=headers, json=atualizacao, ) dados = resposta.json() if dados["success"]: produto = dados["data"] print(f"Produto atualizado! Novo preco: R$ {produto['preco']}") else: print(f"Erro ao atualizar: {dados}")
Exemplo com JavaScript
javascriptconst BASE_URL = "https://api-backend.bunto.com.br/v1"; const TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4"; const produtoId = 143; const atualizacao = { preco: 279.9, preco_promocional: 249.9, descricao_curta: "Tênis esportivo para corrida com amortecimento em gel e solado antiderrapante.", }; const resposta = await fetch(`${BASE_URL}/produtos/${produtoId}/`, { method: "PATCH", headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify(atualizacao), }); const dados = await resposta.json(); if (dados.success) { console.log(`Produto atualizado! Novo preco: R$ ${dados.data.preco}`); } else { console.error(`Erro ao atualizar:`, dados); }
Resposta (200 OK)
json{ "success": true, "message": "Produto atualizado com sucesso", "data": { "id": 143, "nome": "Tênis Esportivo Running Pro", "codigo":"TEN-045", "gtin": "7891234560098", "unidade": "PAR", "marca": "Olympikus", "preco":"279.9000000000", "preco_custo": "145.0000000000", "preco_promocional": "249.9000000000", "formato": "S", "situacao":"A", "controlar_estoque": true, "ativo": true, "categoria_nome": "Calçados", "criado_em": "2026-02-12T15:30:00-03:00", "atualizado_em": "2026-02-12T16:45:00-03:00", "fantasia": "Tênis Esportivo Running Pro", "descricao_curta": "Tênis esportivo para corrida com amortecimento em gel e solado antiderrapante.", "descricao_complementar": null, "observacoes":null, "condicao": "1", "tipo_producao": null, "markup": null, "peso_liquido": "0.320", "peso_bruto": "0.580", "largura": "35.000", "altura": "15.000", "profundidade": "12.000", "estoque_total": "0", "fiscal": null } }
Excluir Produto (Soft Delete)
DELETE /v1/produtos/{id}/
Escopo necessário: produtos: delete
Desativa o produto (soft delete). O registro não é removido permanentemente do banco de dados -- o campo ativo é definido como false, preservando o histórico de vendas e movimentações.
Exemplo com cURL
bashcurl -X DELETE https://api-backend.bunto.com.br/v1/produtos/143/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4'
Exemplo com Python
pythonimport requests BASE_URL = "https://api-backend.bunto.com.br/v1" TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4" headers = {"Authorization": f"Bearer {TOKEN}"} produto_id = 143 resposta = requests.delete(f"{BASE_URL}/produtos/{produto_id}/", headers=headers) dados = resposta.json() if dados["success"]: print(f"Produto excluído com sucesso!") else: print(f"Erro ao excluir: {dados}")
Exemplo com JavaScript
javascriptconst BASE_URL = "https://api-backend.bunto.com.br/v1"; const TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4"; const produtoId = 143; const resposta = await fetch(`${BASE_URL}/produtos/${produtoId}/`, { method: "DELETE", headers: { Authorization: `Bearer ${TOKEN}`, }, }); const dados = await resposta.json(); if (dados.success) { console.log("Produto excluído com sucesso!"); } else { console.error(`Erro ao excluir:`, dados); }
Resposta (200 OK)
json{ "success": true, "message": "Registro excluído com sucesso" }
Importante: Produtos excluídos via soft delete não aparecem mais nas listagens com filtro situacao=A. Para visualizar produtos excluídos, filtre por situacao=E (quando disponível).
Erros Comuns
| Código | Erro | Causa | Solução |
|---|---|---|---|
| 400 | VALIDATION_ERROR | Dados enviados são inválidos (campo obrigatório ausente, formato incorreto, etc.) | Verifique os campos obrigatórios e os tipos de dados |
| 401 | Token invalido | Token ausente, expirado, revogado ou mal formatado | Verifique se o header é Authorization: Bearer bnt_xxx |
| 403 | Token nao tem permissao | O token não possui o escopo produtos ou a ação necessária (read, write, delete) | Verifique os escopos do token no painel |
| 404 | Nao encontrado | Produto não existe ou pertence a outra empresa | Confirme o ID e se o produto pertence à empresa do token |
| 429 | Limite de requisicoes excedido | Rate limit ultrapassado para o tipo de operação | Implemente retry com backoff exponencial |
Exemplo de Resposta de Erro (400)
json{ "success": false, "error": { "code": "VALIDATION_ERROR", "message": "Erro de validacao", "details": { "nome": ["Este campo é obrigatorio."], "gtin": ["Certifique-se de que este campo nao tenha mais de 14 caracteres."] } } }
Exemplo de Resposta de Erro (403)
json{ "detail": "Token nao tem permissao para este recurso" }
Rate Limiting
A API aplica limites de requisição por token (não por IP). Cada tipo de operação tem um limite diferente.
| Operação | Métodos HTTP | Limite |
|---|---|---|
| Leitura | GET, HEAD, OPTIONS | 120 requisições/minuto |
| Escrita | POST, PUT, PATCH | 30 requisições/minuto |
| Exclusão | DELETE | 10 requisições/minuto |
Ao exceder o limite, a API retorna 429 Too Many Requests:
json{ "detail": "Limite de requisicoes excedido. Tente novamente em 45 segundos." }
Boas práticas
- Use
por_pagina=100para reduzir o número de requisições ao listar produtos - Implemente retry com backoff exponencial ao receber
429 - Armazene dados em cache local quando possível
- Para atualizações em lote, use
PATCHapenas com os campos alterados para economizar requisições de escrita
Paginação
Todos os endpoints de listagem retornam dados paginados.
Parâmetros
| Parâmetro | Tipo | Padrão | Máximo | Descrição |
|---|---|---|---|---|
pagina | integer | 1 | - | Número da página |
por_pagina | integer | 25 | 100 | Registros por página |
Atenção: Os parâmetros são pagina e por_pagina (em português), não page e per_page.
Objeto paginacao na resposta
| Campo | Tipo | Descrição |
|---|---|---|
pagina_atual | integer | Número da página atual |
total_paginas | integer | Total de páginas disponíveis |
total_registros | integer | Total de registros encontrados |
por_pagina | integer | Registros por página |
proxima | string / null | URL da próxima página (null se for a última) |
anterior | string / null | URL da página anterior (null se for a primeira) |
Exemplo: percorrer todas as páginas (Python)
pythonimport requests BASE_URL = "https://api-backend.bunto.com.br/v1" TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4" headers = {"Authorization": f"Bearer {TOKEN}"} todos_os_produtos = [] url = f"{BASE_URL}/produtos/?por_pagina=100" while url: resposta = requests.get(url, headers=headers) dados = resposta.json() if not dados["success"]: break todos_os_produtos.extend(dados["data"]["resultados"]) url = dados["data"]["paginacao"]["proxima"] print(f"Total obtido: {len(todos_os_produtos)} produtos")
Valores de Referência
Formato do Produto
| Valor | Descrição |
|---|---|
S | Simples - produto unitário padrão |
K | Kit - conjunto de outros produtos |
V | Com variações - produto com atributos variáveis (tamanho, cor, etc.) |
F | Fabricado - produto de produção própria |
M | Matéria-prima - insumo para fabricação |
Situação do Produto
| Valor | Descrição |
|---|---|
A | Ativo |
I | Inativo |
E | Excluído (soft delete) |
Condição do Produto
| Valor | Descrição |
|---|---|
0 | Não especificado |
1 | Novo |
2 | Usado |
3 | Recondicionado |
Origem Fiscal
| Valor | Descrição |
|---|---|
0 | Nacional |
1 | Estrangeira - Importação direta |
2 | Estrangeira - Adquirida no mercado interno |
3 | Nacional, conteúdo de importação > 40% e <= 70% |
4 | Nacional, produção conforme processos produtivos básicos |
5 | Nacional, conteúdo de importação <= 40% |
6 | Estrangeira - Importação direta, sem similar nacional (CAMEX) |
7 | Estrangeira - Mercado interno, sem similar nacional (CAMEX) |
8 | Nacional, conteúdo de importação > 70% |
Tipo do Item SPED
| Valor | Descrição |
|---|---|
00 | Mercadoria para Revenda |
01 | Matéria-Prima |
02 | Embalagem |
03 | Produto em Processo |
04 | Produto Acabado |
05 | Subproduto |
06 | Produto Intermediário |
07 | Material de Uso e Consumo |
08 | Ativo Imobilizado |
09 | Serviços |
10 | Outros insumos |
99 | Outras |