API de Empresas
Consulta e atualização dos dados da empresa via API.
Consulte e atualize os dados cadastrais da sua empresa via API. Este endpoint permite visualizar e editar informações como razao social, endereco, contato e inscricoes fiscais. Cada token de API acessa exclusivamente os dados da propria empresa vinculada.
Quem usa a chave do cadastro principal da conta também abre novas empresas e emite chaves para elas, dentro do limite contratado.
Visao Geral
| Propriedade | Valor |
|---|---|
| Base URL (produção) | https://api-backend.bunto.com.br/v1/empresas/ |
| Autenticação | Authorization: Bearer bnt_xxx |
| Formato | JSON |
| Escopo necessário (leitura) | empresas: read |
| Escopo necessário (escrita) | empresas: write |
| Escopo para abrir empresa | empresas: criar_empresa |
| Escopo para emitir chave | empresas: gerar_chave |
Endpoints
| Método | Endpoint | Descrição | Escopo |
|---|---|---|---|
| GET | /v1/empresas/ | Listar empresa (retorna apenas a propria) | empresas: read |
| GET | /v1/empresas/{id}/ | Detalhar empresa | empresas: read |
| PUT | /v1/empresas/{id}/ | Atualizar empresa (completo) | empresas: write |
| PATCH | /v1/empresas/{id}/ | Atualizar empresa (parcial) | empresas: write |
| POST | /v1/empresas/ | Abrir nova empresa na mesma conta | empresas: criar_empresa |
| POST | /v1/empresas/{id}/chaves/ | Emitir chave de API de uma empresa da conta | empresas: gerar_chave |
| GET | /v1/empresas/escopos/ | Permissões que uma chave pode receber | empresas: read |
| GET | /v1/empresas/limite/ | Quantas empresas ainda cabem no contrato | empresas: read |
| GET | /v1/empresas/da-conta/ | Empresas e filiais que a conta administra | empresas: read |
Importante: leitura e edição alcançam apenas a propria empresa. A listagem retorna sempre um único registro (a empresa vinculada ao token) e não e possível consultar dados de outras empresas por ela. A exclusão de empresa não e permitida via API.
Contas com várias empresas
Uma conta pode reunir várias empresas: a que abriu o cadastro (o cadastro principal) e as demais, criadas depois. Cada uma tem CNPJ, dados e chave próprios; nenhuma enxerga os dados da outra.
Três regras valem para as rotas de abertura e de emissão de chave:
- Só a chave do cadastro principal comanda. A chave de uma empresa criada por esse caminho lê e edita apenas a si mesma. Ela não abre outra empresa nem emite chaves, e responde
403se tentar. - A empresa nova nasce igual à principal. Mesmo pacote de recursos e uma cópia dos perfis de acesso já montados, para não ter de refazer tudo do zero.
- O contrato manda no total. Cada abertura consome uma vaga; alcançado o teto, a resposta é
400com a mensagem pronta para exibir ao usuário. ConsulteGET /v1/empresas/limite/antes de abrir.
Filiais (unidades do mesmo CNPJ raiz) não consomem vaga, mas podem ter chave própria — elas aparecem em GET /v1/empresas/da-conta/ com ocupa_limite: false.
Escopos dedicados
Abrir empresa e emitir chave não vêm junto do write: são escopos próprios (criar_empresa e gerar_chave), marcados um a um na criação do aplicativo. Uma integração que só sincroniza cadastro nunca ganha o poder de abrir empresa por tabela.
Chave restrita por escopo
A chave emitida pode nascer limitada aos módulos e ações que a integração realmente usa, em vez de acesso total. Consulte antes GET /v1/empresas/escopos/: a lista já vem filtrada pelo plano da empresa, então o que estiver ali é o que a chave consegue exercer de fato.
Pedir um módulo fora do plano é recusado com 400, e não aceito em silêncio — uma chave com permissão que ela nunca poderá usar só produziria um 403 inexplicável na primeira chamada.
Listar Empresa
GET /v1/empresas/
Escopo necessário: empresas: read
Retorna a lista contendo apenas a empresa vinculada ao token de autenticação. Diferente de outros endpoints, este sempre retorna exatamente um registro.
Exemplo com cURL
bashcurl https://api-backend.bunto.com.br/v1/empresas/ \ -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", } # Consultar dados da empresa resposta = requests.get(f"{BASE_URL}/empresas/", headers=headers) dados = resposta.json() if dados["success"]: empresas = dados["data"]["resultados"] empresa = empresas[0] # Sempre retorna apenas uma empresa print(f"Empresa: {empresa['nome_empresa']}") print(f"CNPJ: {empresa['cnpj']}") print(f"Regime: {empresa['regime_tributario']}") 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 resposta = await fetch(`${BASE_URL}/empresas/`, { headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }, }); const dados = await resposta.json(); if (dados.success) { const empresa = dados.data.resultados[0]; // Sempre retorna apenas uma empresa console.log(`Empresa: ${empresa.nome_empresa}`); console.log(`CNPJ: ${empresa.cnpj}`); console.log(`Regime: ${empresa.regime_tributario}`); } else { console.error(`Erro: ${resposta.status}`); }
Resposta (200 OK)
json{ "success": true, "message": "1 registros encontrados", "data": { "resultados": [ { "id": 1, "nome_empresa": "Bunto Comercio de Roupas Ltda", "cnpj": "12.345.678/0001-90", "nome_fantasia": "Bunto Moda", "tipo_pessoa": "J", "regime_tributario": 1, "ativo": true, "criado_em": "2025-06-15T10:00:00-03:00" } ], "paginacao": { "pagina_atual": 1, "total_paginas": 1, "total_registros": 1, "por_pagina": 25, "proxima": null, "anterior": null } } }
Campos da Listagem
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | Identificador único da empresa |
nome_empresa | string | Razao social da empresa |
cnpj | string / null | CNPJ da empresa (formatado) |
nome_fantasia | string / null | Nome fantasia |
tipo_pessoa | string / null | Tipo de pessoa: F (fisica) ou J (juridica) |
regime_tributario | integer | Regime tributario (1 = Simples Nacional, 2 = Lucro Presumido, 3 = Lucro Real) |
ativo | boolean | Se a empresa esta ativa |
criado_em | datetime | Data e hora de criação |
Obter Empresa
GET /v1/empresas/{id}/
Escopo necessário: empresas: read
Retorna os dados completos da empresa, incluindo endereco, contato, inscricoes fiscais e demais informações cadastrais.
Exemplo com cURL
bashcurl https://api-backend.bunto.com.br/v1/empresas/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", } empresa_id = 1 resposta = requests.get(f"{BASE_URL}/empresas/{empresa_id}/", headers=headers) dados = resposta.json() if dados["success"]: empresa = dados["data"] print(f"Empresa: {empresa['nome_empresa']}") print(f"Fantasia: {empresa['nome_fantasia']}") print(f"CNPJ: {empresa['cnpj']}") print(f"Email: {empresa['email']}") print(f"Endereco: {empresa['endereco']}, {empresa['numero']} - {empresa['cidade']}/{empresa['uf']}") else: print(f"Erro: {dados}")
Exemplo com JavaScript
javascriptconst BASE_URL = "https://api-backend.bunto.com.br/v1"; const TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4"; const empresaId = 1; const resposta = await fetch(`${BASE_URL}/empresas/${empresaId}/`, { headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }, }); const dados = await resposta.json(); if (dados.success) { const empresa = dados.data; console.log(`Empresa: ${empresa.nome_empresa}`); console.log(`Fantasia: ${empresa.nome_fantasia}`); console.log(`CNPJ: ${empresa.cnpj}`); console.log(`Email: ${empresa.email}`); console.log( `Endereco: ${empresa.endereco}, ${empresa.numero} - ${empresa.cidade}/${empresa.uf}` ); } else { console.error(`Erro: ${JSON.stringify(dados)}`); }
Resposta (200 OK)
json{ "success": true, "message": "Registro encontrado", "data": { "id": 1, "nome_empresa": "Bunto Comercio de Roupas Ltda", "cnpj": "12.345.678/0001-90", "nome_fantasia": "Bunto Moda", "tipo_pessoa": "J", "regime_tributario": 1, "ativo": true, "criado_em": "2025-06-15T10:00:00-03:00", "inscricao_estadual": "123.456.789.001", "inscricao_municipal": "987654", "atividade_principal": "4781-4/00 - Comercio varejista de artigos de vestuario e acessorios", "porte_empresa": "ME", "email": "contato@buntomoda.com.br", "telefone": "(11) 3456-7890", "celular": "(11) 99876-5432", "cep": "01310100", "uf": "SP", "cidade": "Sao Paulo", "bairro": "Bela Vista", "endereco": "Avenida Paulista", "numero":"1000", "complemento": "Sala 501", "site": "https://www.buntomoda.com.br", "atualizado_em": "2026-02-10T14:22:00-03:00" } }
Campos do Detalhe (adicionais a listagem)
| Campo | Tipo | Descrição |
|---|---|---|
inscricao_estadual | string / null | Inscricao estadual |
inscricao_municipal | string / null | Inscricao municipal |
atividade_principal | string / null | Atividade principal (CNAE) |
porte_empresa | string / null | Porte da empresa (ME, EPP, etc.) |
email | string / null | E-mail de contato |
telefone | string / null | Telefone fixo |
celular | string / null | Celular |
cep | string / null | CEP (8 digitos, sem formatacao) |
uf | string / null | Unidade federativa (2 caracteres) |
cidade | string / null | Cidade |
bairro | string / null | Bairro |
endereco | string / null | Logradouro (rua, avenida, etc.) |
numero | string / null | Número do endereco |
complemento | string / null | Complemento do endereco |
site | string / null | Site da empresa |
atualizado_em | datetime | Data e hora da última atualização |
Atualizar Empresa
PUT /v1/empresas/{id}/
PATCH /v1/empresas/{id}/
Escopo necessário: empresas: write
Atualiza os dados cadastrais da empresa. Use PUT para atualização completa ou PATCH para atualização parcial (apenas os campos enviados serão alterados).
Nota: Campos como cnpj, tipo_pessoa, regime_tributario e ativo não sao editaveis via API. Para alterar esses dados, acesse o painel administrativo do Bunto ERP.
Campos do Request Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome_empresa | string | Não | Razao social (máximo 255 caracteres) |
nome_fantasia | string | Não | Nome fantasia (máximo 255 caracteres) |
email | string | Não | E-mail de contato (máximo 100 caracteres) |
telefone | string | Não | Telefone fixo (máximo 20 caracteres) |
celular | string | Não | Celular (máximo 20 caracteres) |
cep | string | Não | CEP (máximo 8 caracteres, sem formatacao) |
uf | string | Não | Unidade federativa (máximo 2 caracteres) |
cidade | string | Não | Cidade (máximo 100 caracteres) |
bairro | string | Não | Bairro (máximo 100 caracteres) |
endereco | string | Não | Logradouro (máximo 255 caracteres) |
numero | string | Não | Número do endereco (máximo 10 caracteres) |
complemento | string | Não | Complemento (máximo 100 caracteres) |
site | string | Não | Site da empresa (máximo 100 caracteres) |
inscricao_estadual | string | Não | Inscricao estadual (máximo 20 caracteres) |
inscricao_municipal | string | Não | Inscricao municipal (máximo 20 caracteres) |
Exemplo com cURL (PATCH - atualização parcial)
bashcurl -X PATCH https://api-backend.bunto.com.br/v1/empresas/1/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json' \ -d '{ "email": "novo-contato@buntomoda.com.br", "celular": "(11) 91234-5678", "site": "https://www.buntomoda.com.br" }'
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", } empresa_id = 1 # Atualizacao parcial (PATCH) - apenas os campos que mudaram atualizacao = { "email": "novo-contato@buntomoda.com.br", "celular": "(11) 91234-5678", "site": "https://www.buntomoda.com.br", } resposta = requests.patch( f"{BASE_URL}/empresas/{empresa_id}/", headers=headers, json=atualizacao, ) dados = resposta.json() if dados["success"]: empresa = dados["data"] print(f"Empresa atualizada! Email: {empresa['email']}") print(f"Celular: {empresa['celular']}") 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 empresaId = 1; const atualizacao = { email: "novo-contato@buntomoda.com.br", celular: "(11) 91234-5678", site: "https://www.buntomoda.com.br", }; const resposta = await fetch(`${BASE_URL}/empresas/${empresaId}/`, { method: "PATCH", headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify(atualizacao), }); const dados = await resposta.json(); if (dados.success) { console.log(`Empresa atualizada! Email: ${dados.data.email}`); console.log(`Celular: ${dados.data.celular}`); } else { console.error(`Erro ao atualizar:`, dados); }
Resposta (200 OK)
json{ "success": true, "message": "Empresa atualizada com sucesso", "data": { "id": 1, "nome_empresa": "Bunto Comercio de Roupas Ltda", "cnpj": "12.345.678/0001-90", "nome_fantasia": "Bunto Moda", "tipo_pessoa": "J", "regime_tributario": 1, "ativo": true, "criado_em": "2025-06-15T10:00:00-03:00", "inscricao_estadual": "123.456.789.001", "inscricao_municipal": "987654", "atividade_principal": "4781-4/00 - Comercio varejista de artigos de vestuario e acessorios", "porte_empresa": "ME", "email": "novo-contato@buntomoda.com.br", "telefone": "(11) 3456-7890", "celular": "(11) 91234-5678", "cep": "01310100", "uf": "SP", "cidade": "Sao Paulo", "bairro": "Bela Vista", "endereco": "Avenida Paulista", "numero":"1000", "complemento": "Sala 501", "site": "https://www.buntomoda.com.br", "atualizado_em": "2026-02-12T16:45:00-03:00" } }
Listar Permissões Disponíveis
GET /v1/empresas/escopos/
Escopo necessário: empresas: read
Devolve os módulos e ações que uma chave desta empresa pode receber, já filtrados pelo plano dela. Use antes de emitir uma chave restrita: o que não aparece aqui não pode ser concedido.
Parâmetros de Query
| Parâmetro | Tipo | Descrição |
|---|---|---|
empresa_id | integer | Responder pela empresa indicada, em vez da empresa da chave. Aceita as empresas da conta (exige a chave do cadastro principal) |
Exemplo com cURL
bashcurl https://api-backend.bunto.com.br/v1/empresas/escopos/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' # Antes de emitir chave para outra empresa da conta curl 'https://api-backend.bunto.com.br/v1/empresas/escopos/?empresa_id=12' \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4'
Resposta (200 OK)
json{ "success": true, "message": "22 módulos disponíveis", "data": { "empresa_id": 12, "modulos": { "produtos": { "nome": "Produtos", "descricao": "Gerencie produtos e catálogo", "categoria": "cadastros", "acoes": ["read", "write", "delete"] }, "vendas": { "nome": "Vendas", "descricao": "Registre e acompanhe vendas", "categoria": "vendas", "acoes": ["read", "write", "delete"] }, "empresas": { "nome": "Empresas", "descricao": "Gerencie dados da empresa", "categoria": "sistema", "acoes": ["read", "write", "criar_empresa", "gerar_chave"] } } } }
Campos de cada módulo
| Campo | Tipo | Descrição |
|---|---|---|
nome | string | Nome do módulo para exibir ao usuário |
descricao | string | O que o módulo faz |
categoria | string | Agrupamento para montar a tela de seleção |
acoes | array | Ações concedíveis. read, write e delete na maioria; alguns módulos têm ações nomeadas |
Módulo que não está no plano da empresa simplesmente não aparece na lista. Pedi-lo na emissão devolve 400.
Consultar o Limite do Contrato
GET /v1/empresas/limite/
Escopo necessário: empresas: read (com a chave do cadastro principal)
Diz quantas empresas a conta já usa e quantas ainda cabem. Consulte antes de abrir uma nova para não montar o cadastro inteiro e levar recusa no fim.
Exemplo com cURL
bashcurl https://api-backend.bunto.com.br/v1/empresas/limite/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4'
Resposta (200 OK)
json{ "success": true, "message": "Situação do plano", "data": { "limite": 5, "usadas": 3, "disponivel": 2, "ilimitado": false, "pode_criar": true, "plano": "Profissional", "origem": "plano" } }
Campos da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
limite | integer | Total de empresas permitidas. 0 quando não há teto |
usadas | integer | Empresas ativas que já ocupam vaga (filiais não entram) |
disponivel | integer | Quantas ainda cabem. -1 quando não há teto |
ilimitado | boolean | true quando a conta não tem teto |
pode_criar | boolean | Se uma nova abertura seria aceita agora |
plano | string / null | Nome do plano da conta |
origem | string | plano (veio do contrato), empresa (ajuste combinado para esta conta) ou nenhuma |
Listar Empresas da Conta
GET /v1/empresas/da-conta/
Escopo necessário: empresas: read (com a chave do cadastro principal)
Devolve tudo que a conta administra: as empresas e as filiais de cada uma. É o índice para a emissão de chaves — qualquer id desta lista é aceito em POST /v1/empresas/{id}/chaves/.
Exemplo com cURL
bashcurl https://api-backend.bunto.com.br/v1/empresas/da-conta/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4'
Resposta (200 OK)
json{ "success": true, "message": "3 empresas encontradas", "data": [ { "id": 1, "nome_empresa": "Bunto Comercio de Roupas Ltda", "cnpj": "12.345.678/0001-90", "nome_fantasia": "Bunto Moda", "tipo_pessoa": "J", "regime_tributario": 1, "ativo": true, "criado_em": "2025-06-15T10:00:00-03:00", "empresa_pai_id": null, "ocupa_limite": true }, { "id": 12, "nome_empresa": "Loja da Praia Ltda", "cnpj": "98.765.432/0001-10", "nome_fantasia": "Loja da Praia", "tipo_pessoa": "J", "regime_tributario": 1, "ativo": true, "criado_em": "2026-03-02T09:30:00-03:00", "empresa_pai_id": null, "ocupa_limite": true }, { "id": 13, "nome_empresa": "Loja da Praia - Unidade Centro", "cnpj": "98.765.432/0002-01", "nome_fantasia": "Loja da Praia Centro", "tipo_pessoa": "J", "regime_tributario": 1, "ativo": true, "criado_em": "2026-03-10T11:15:00-03:00", "empresa_pai_id": 12, "ocupa_limite": false } ] }
Campos adicionais
| Campo | Tipo | Descrição |
|---|---|---|
empresa_pai_id | integer / null | Preenchido nas filiais, com o id da matriz |
ocupa_limite | boolean | true nas empresas que consomem vaga do contrato |
Abrir Nova Empresa
POST /v1/empresas/
Escopo necessário: empresas: criar_empresa (com a chave do cadastro principal)
Cria uma empresa na mesma conta. Ela nasce com o pacote de recursos e os perfis de acesso do cadastro principal, e passa a aparecer no seletor de empresas de quem responde pela conta.
O CNPJ é opcional: a empresa pode nascer só para separar operações e receber o CNPJ depois, nas configurações. Quando informado, vale a validação completa (14 dígitos, dígito verificador e sem duplicidade na base).
Campos do Request Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome_empresa | string | Sim | Razão social (máximo 255 caracteres) |
segmento | string | Sim | Segmento de trabalho (ex.: Comércio, Indústria, Serviços) |
atividade | string | Sim | Atividade principal (ex.: Varejo, Atacado, Manufatura) |
cnpj | string | Não | CNPJ, com ou sem formatação |
nome_fantasia | string | Não | Nome fantasia (máximo 255 caracteres) |
email | string | Não | E-mail de contato |
telefone | string | Não | Telefone fixo |
celular | string | Não | Celular |
gerar_chave | boolean | Não | Quando true, devolve a chave de API da empresa nova nesta resposta. Padrão: false |
Exemplo com cURL
bashcurl -X POST https://api-backend.bunto.com.br/v1/empresas/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json' \ -d '{ "nome_empresa": "Loja da Praia Ltda", "nome_fantasia": "Loja da Praia", "segmento": "Comércio", "atividade": "Varejo", "cnpj": "98765432000110", "gerar_chave": true }'
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", } # 1. Verificar se ainda cabe uma empresa limite = requests.get(f"{BASE_URL}/empresas/limite/", headers=headers).json() if not limite["data"]["pode_criar"]: print(f"Limite alcançado: {limite['data']['usadas']}/{limite['data']['limite']}") else: # 2. Abrir a empresa já pedindo a chave dela resposta = requests.post( f"{BASE_URL}/empresas/", headers=headers, json={ "nome_empresa": "Loja da Praia Ltda", "nome_fantasia": "Loja da Praia", "segmento": "Comércio", "atividade": "Varejo", "cnpj": "98765432000110", "gerar_chave": True, }, ) dados = resposta.json() if dados["success"]: empresa = dados["data"] print(f"Empresa {empresa['empresa_id']} criada") # A chave aparece só aqui: guarde antes de seguir chave = empresa["chave"]["token"] print(f"Chave: {chave}") else: print(f"Erro: {dados['message']}")
Exemplo com JavaScript
javascriptconst BASE_URL = "https://api-backend.bunto.com.br/v1"; const TOKEN = "bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4"; const headers = { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", }; const resposta = await fetch(`${BASE_URL}/empresas/`, { method: "POST", headers, body: JSON.stringify({ nome_empresa: "Loja da Praia Ltda", nome_fantasia: "Loja da Praia", segmento: "Comércio", atividade: "Varejo", cnpj: "98765432000110", gerar_chave: true, }), }); const dados = await resposta.json(); if (dados.success) { console.log(`Empresa ${dados.data.empresa_id} criada`); console.log(`Chave: ${dados.data.chave.token}`); // aparece só aqui } else { console.error(dados.message); }
Resposta (201 Created)
json{ "success": true, "message": "Empresa criada com sucesso", "data": { "empresa_id": 12, "nome_empresa": "Loja da Praia Ltda", "cnpj": "98765432000110", "limite": { "limite": 5, "usadas": 4, "disponivel": 1, "ilimitado": false, "pode_criar": true, "plano": "Profissional", "origem": "plano" }, "perfis_acesso_copiados": 5, "chave": { "token": "bnt_U8AjdMskrrP_whhIC15PNMcxLdrFc1B2_yF8z0WptIev", "prefixo": "bnt_U8AjdM", "aviso": "Guarde esta chave agora: ela nao pode ser consultada depois." } } }
O bloco chave só vem quando gerar_chave é true. O texto completo da chave aparece uma única vez — não há como recuperá-lo depois.
Campos da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
empresa_id | integer | Identificador da empresa criada |
nome_empresa | string | Razão social gravada |
cnpj | string / null | CNPJ, quando informado |
limite | object | Situação do contrato já contando a empresa nova |
perfis_acesso_copiados | integer | Quantos perfis de acesso foram replicados do cadastro principal |
chave | object / null | Chave de API da empresa nova, quando pedida |
Emitir Chave de API
POST /v1/empresas/{id}/chaves/
Escopo necessário: empresas: gerar_chave (com a chave do cadastro principal)
Emite uma chave para qualquer empresa ou filial da conta — inclusive para a própria empresa principal. Use os id devolvidos por GET /v1/empresas/da-conta/.
Cada chave alcança somente a empresa dela: a chave de uma filial não enxerga a matriz nem as demais unidades.
Campos do Request Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome | string | Não | Nome que identifica a chave na listagem (máximo 100 caracteres). Padrão: Chave de integração |
escopos | object | Não | Módulos e ações liberados, no formato {"produtos": ["read"], "vendas": ["read", "write"]}. Omitido, a chave nasce sem restrição (acesso total à empresa) |
ips_permitidos | array | Não | IPs ou faixas CIDR autorizados a usar a chave. Vazio: qualquer IP |
Escopo é opt-in e não se corrige depois: a chave nasce com o que foi enviado e a lista não é editável. Para mudar o alcance, emita outra e revogue a anterior.
Exemplo com cURL
bash# Chave com acesso total à empresa curl -X POST https://api-backend.bunto.com.br/v1/empresas/12/chaves/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json' \ -d '{"nome": "Integração da loja"}' # Chave restrita: só lê produtos e movimenta vendas curl -X POST https://api-backend.bunto.com.br/v1/empresas/12/chaves/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json' \ -d '{ "nome": "Integração da loja", "escopos": {"produtos": ["read"], "vendas": ["read", "write"]}, "ips_permitidos": ["203.0.113.50"] }'
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", } empresa_id = 12 resposta = requests.post( f"{BASE_URL}/empresas/{empresa_id}/chaves/", headers=headers, json={"nome": "Integração da loja"}, ) dados = resposta.json() if dados["success"]: # Guarde agora: a chave não pode ser consultada depois print(f"Chave: {dados['data']['token']}") print(f"Prefixo: {dados['data']['prefixo']}") else: print(f"Erro: {dados['message']}")
Resposta (201 Created)
json{ "success": true, "message": "Chave gerada com sucesso", "data": { "empresa_id": 12, "nome": "Integração da loja", "token": "bnt_QSzXrxnnnz8fBPGDl-6X-QCiQHD-0AUEyTdziExpxUH2", "prefixo": "bnt_QSzXrx", "criado_em": "2026-08-07T20:22:44.821338Z", "aviso": "Guarde esta chave agora: ela nao pode ser consultada depois." } }
Erros específicos
| Código | Situação |
|---|---|
| 400 | Módulo ou ação inexistente em escopos, ou módulo fora do plano da empresa |
| 400 | escopos enviado vazio — omita o campo para chave sem restrição |
| 400 | criar_empresa ou gerar_chave pedidos para empresa que não é o cadastro principal |
| 403 | A chave usada não é do cadastro principal da conta |
| 403 | A chave usada é restrita e tentou conceder escopo que ela própria não tem |
| 404 | O id informado não pertence a esta conta |
Erros Comuns
| Código | Erro | Causa | Solucao |
|---|---|---|---|
| 400 | VALIDATION_ERROR | Dados enviados sao invalidos (campo com formato incorreto, tamanho excedido, etc.) | Verifique os tipos de dados e limites de tamanho |
| 400 | Limite de empresas alcançado | A conta já usa todas as vagas do contrato | Consulte GET /v1/empresas/limite/ e fale com quem cuida do plano |
| 400 | CNPJ inválido / Já existe uma empresa cadastrada com este CNPJ. | CNPJ com dígito verificador errado ou já usado por outra empresa | Confira o número ou abra a empresa sem CNPJ e preencha depois |
| 401 | Token invalido | Token ausente, expirado, revogado ou mal formatado | Verifique se o header e Authorization: Bearer bnt_xxx |
| 403 | Token nao tem permissao | O token não possui o escopo empresas ou a ação necessária (read, write, criar_empresa, gerar_chave) | Verifique os escopos do token no painel |
| 403 | Chave fora do cadastro principal | A chave usada pertence a uma empresa criada pela API, que não abre outras nem emite chaves | Use a chave da empresa que abriu a conta |
| 404 | Nao encontrado | ID informado não corresponde a empresa do token | Use o ID da propria empresa (obtido via listagem) |
| 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": { "uf": ["Certifique-se de que este campo nao tenha mais de 2 caracteres."], "cep": ["Certifique-se de que este campo nao tenha mais de 8 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 praticas
- Armazene os dados da empresa em cache local, pois raramente mudam
- Use
PATCHcom apenas os campos alterados ao inves dePUTcom todos os dados - Implemente retry com backoff exponencial ao receber
429
Valores de Referencia
Regime Tributario
| Valor | Descrição |
|---|---|
1 | Simples Nacional |
2 | Lucro Presumido |
3 | Lucro Real |
Tipo de Pessoa
| Valor | Descrição |
|---|---|
F | Pessoa Fisica |
J | Pessoa Juridica |
Porte da Empresa
| Valor | Descrição |
|---|---|
ME | Microempresa |
EPP | Empresa de Pequeno Porte |
DEMAIS | Demais |