Developers/Documentação da API/API de Empresas

API de Empresas

Consulta e atualização dos dados da empresa via API.

13/02/202624 min de leitura21 visualizaçõesv3

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

PropriedadeValor
Base URL (produção)https://api-backend.bunto.com.br/v1/empresas/
AutenticaçãoAuthorization: Bearer bnt_xxx
FormatoJSON
Escopo necessário (leitura)empresas: read
Escopo necessário (escrita)empresas: write
Escopo para abrir empresaempresas: criar_empresa
Escopo para emitir chaveempresas: gerar_chave

Endpoints

MétodoEndpointDescriçãoEscopo
GET/v1/empresas/Listar empresa (retorna apenas a propria)empresas: read
GET/v1/empresas/{id}/Detalhar empresaempresas: 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 contaempresas: criar_empresa
POST/v1/empresas/{id}/chaves/Emitir chave de API de uma empresa da contaempresas: gerar_chave
GET/v1/empresas/escopos/Permissões que uma chave pode receberempresas: read
GET/v1/empresas/limite/Quantas empresas ainda cabem no contratoempresas: read
GET/v1/empresas/da-conta/Empresas e filiais que a conta administraempresas: 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:

  1. 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 403 se tentar.
  2. 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.
  3. O contrato manda no total. Cada abertura consome uma vaga; alcançado o teto, a resposta é 400 com a mensagem pronta para exibir ao usuário. Consulte GET /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

bash
curl https://api-backend.bunto.com.br/v1/empresas/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json'

Exemplo com Python

python
import 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

javascript
const 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

CampoTipoDescrição
idintegerIdentificador único da empresa
nome_empresastringRazao social da empresa
cnpjstring / nullCNPJ da empresa (formatado)
nome_fantasiastring / nullNome fantasia
tipo_pessoastring / nullTipo de pessoa: F (fisica) ou J (juridica)
regime_tributariointegerRegime tributario (1 = Simples Nacional, 2 = Lucro Presumido, 3 = Lucro Real)
ativobooleanSe a empresa esta ativa
criado_emdatetimeData 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

bash
curl https://api-backend.bunto.com.br/v1/empresas/1/ \ -H 'Authorization: Bearer bnt_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v2W3x4' \ -H 'Content-Type: application/json'

Exemplo com Python

python
import 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

javascript
const 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)

CampoTipoDescrição
inscricao_estadualstring / nullInscricao estadual
inscricao_municipalstring / nullInscricao municipal
atividade_principalstring / nullAtividade principal (CNAE)
porte_empresastring / nullPorte da empresa (ME, EPP, etc.)
emailstring / nullE-mail de contato
telefonestring / nullTelefone fixo
celularstring / nullCelular
cepstring / nullCEP (8 digitos, sem formatacao)
ufstring / nullUnidade federativa (2 caracteres)
cidadestring / nullCidade
bairrostring / nullBairro
enderecostring / nullLogradouro (rua, avenida, etc.)
numerostring / nullNúmero do endereco
complementostring / nullComplemento do endereco
sitestring / nullSite da empresa
atualizado_emdatetimeData 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

CampoTipoObrigatórioDescrição
nome_empresastringNãoRazao social (máximo 255 caracteres)
nome_fantasiastringNãoNome fantasia (máximo 255 caracteres)
emailstringNãoE-mail de contato (máximo 100 caracteres)
telefonestringNãoTelefone fixo (máximo 20 caracteres)
celularstringNãoCelular (máximo 20 caracteres)
cepstringNãoCEP (máximo 8 caracteres, sem formatacao)
ufstringNãoUnidade federativa (máximo 2 caracteres)
cidadestringNãoCidade (máximo 100 caracteres)
bairrostringNãoBairro (máximo 100 caracteres)
enderecostringNãoLogradouro (máximo 255 caracteres)
numerostringNãoNúmero do endereco (máximo 10 caracteres)
complementostringNãoComplemento (máximo 100 caracteres)
sitestringNãoSite da empresa (máximo 100 caracteres)
inscricao_estadualstringNãoInscricao estadual (máximo 20 caracteres)
inscricao_municipalstringNãoInscricao municipal (máximo 20 caracteres)

Exemplo com cURL (PATCH - atualização parcial)

bash
curl -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

python
import 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

javascript
const 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âmetroTipoDescrição
empresa_idintegerResponder pela empresa indicada, em vez da empresa da chave. Aceita as empresas da conta (exige a chave do cadastro principal)

Exemplo com cURL

bash
curl 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

CampoTipoDescrição
nomestringNome do módulo para exibir ao usuário
descricaostringO que o módulo faz
categoriastringAgrupamento para montar a tela de seleção
acoesarrayAçõ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

bash
curl 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

CampoTipoDescrição
limiteintegerTotal de empresas permitidas. 0 quando não há teto
usadasintegerEmpresas ativas que já ocupam vaga (filiais não entram)
disponivelintegerQuantas ainda cabem. -1 quando não há teto
ilimitadobooleantrue quando a conta não tem teto
pode_criarbooleanSe uma nova abertura seria aceita agora
planostring / nullNome do plano da conta
origemstringplano (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

bash
curl 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

CampoTipoDescrição
empresa_pai_idinteger / nullPreenchido nas filiais, com o id da matriz
ocupa_limitebooleantrue 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

CampoTipoObrigatórioDescrição
nome_empresastringSimRazão social (máximo 255 caracteres)
segmentostringSimSegmento de trabalho (ex.: Comércio, Indústria, Serviços)
atividadestringSimAtividade principal (ex.: Varejo, Atacado, Manufatura)
cnpjstringNãoCNPJ, com ou sem formatação
nome_fantasiastringNãoNome fantasia (máximo 255 caracteres)
emailstringNãoE-mail de contato
telefonestringNãoTelefone fixo
celularstringNãoCelular
gerar_chavebooleanNãoQuando true, devolve a chave de API da empresa nova nesta resposta. Padrão: false

Exemplo com cURL

bash
curl -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

python
import 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

javascript
const 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

CampoTipoDescrição
empresa_idintegerIdentificador da empresa criada
nome_empresastringRazão social gravada
cnpjstring / nullCNPJ, quando informado
limiteobjectSituação do contrato já contando a empresa nova
perfis_acesso_copiadosintegerQuantos perfis de acesso foram replicados do cadastro principal
chaveobject / nullChave 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

CampoTipoObrigatórioDescrição
nomestringNãoNome que identifica a chave na listagem (máximo 100 caracteres). Padrão: Chave de integração
escoposobjectNãoMódulos e ações liberados, no formato {"produtos": ["read"], "vendas": ["read", "write"]}. Omitido, a chave nasce sem restrição (acesso total à empresa)
ips_permitidosarrayNãoIPs 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

python
import 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ódigoSituação
400Módulo ou ação inexistente em escopos, ou módulo fora do plano da empresa
400escopos enviado vazio — omita o campo para chave sem restrição
400criar_empresa ou gerar_chave pedidos para empresa que não é o cadastro principal
403A chave usada não é do cadastro principal da conta
403A chave usada é restrita e tentou conceder escopo que ela própria não tem
404O id informado não pertence a esta conta

Erros Comuns

CódigoErroCausaSolucao
400VALIDATION_ERRORDados enviados sao invalidos (campo com formato incorreto, tamanho excedido, etc.)Verifique os tipos de dados e limites de tamanho
400Limite de empresas alcançadoA conta já usa todas as vagas do contratoConsulte GET /v1/empresas/limite/ e fale com quem cuida do plano
400CNPJ inválido / Já existe uma empresa cadastrada com este CNPJ.CNPJ com dígito verificador errado ou já usado por outra empresaConfira o número ou abra a empresa sem CNPJ e preencha depois
401Token invalidoToken ausente, expirado, revogado ou mal formatadoVerifique se o header e Authorization: Bearer bnt_xxx
403Token nao tem permissaoO 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
403Chave fora do cadastro principalA chave usada pertence a uma empresa criada pela API, que não abre outras nem emite chavesUse a chave da empresa que abriu a conta
404Nao encontradoID informado não corresponde a empresa do tokenUse o ID da propria empresa (obtido via listagem)
429Limite de requisicoes excedidoRate limit ultrapassado para o tipo de operaçãoImplemente 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çãoMétodos HTTPLimite
LeituraGET, HEAD, OPTIONS120 requisições/minuto
EscritaPOST, PUT, PATCH30 requisições/minuto
ExclusãoDELETE10 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 PATCH com apenas os campos alterados ao inves de PUT com todos os dados
  • Implemente retry com backoff exponencial ao receber 429

Valores de Referencia

Regime Tributario

ValorDescrição
1Simples Nacional
2Lucro Presumido
3Lucro Real

Tipo de Pessoa

ValorDescrição
FPessoa Fisica
JPessoa Juridica

Porte da Empresa

ValorDescrição
MEMicroempresa
EPPEmpresa de Pequeno Porte
DEMAISDemais
APIcURLEmpresasJavaScriptPythonREST
Recursos para IA