{"openapi":"3.1.0","info":{"title":"Vitt Integrações API","version":"0.2.6","description":"API REST multiempresa do ERP. Aplicativos não se conectam diretamente ao SQL Server; todo acesso ao ERP passa por esta API."},"servers":[{"url":"https://api.d7.dnsbr.link","description":"API de negócios online."}],"paths":{"/api/v1/saude":{"get":{"summary":"Consultar saúde da API","description":"Endpoint público para monitoramento. Informa estado do serviço e do banco, latência, versão e horário. Retorna HTTP 503 se o banco estiver indisponível.\n\nAutenticação: Público.\nResposta de referência: 200: {\"status\":\"ok\",\"versao\":\"0.2.6\",\"banco\":\"ok\",\"latenciaBancoMs\":12,\"tempoNoArMs\":15000,\"timestamp\":\"2026-09-28T12:00:00.000Z\"}","operationId":"op-get-api-v1-saude","tags":["Saúde e diagnóstico"],"responses":{"200":{"description":"200: {\"status\":\"ok\",\"versao\":\"0.2.6\",\"banco\":\"ok\",\"latenciaBancoMs\":12,\"tempoNoArMs\":15000,\"timestamp\":\"2026-09-28T12:00:00.000Z\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/diagnostico":{"get":{"summary":"Diagnosticar chave e conexão","description":"Valida a chave sem exigir que ela já esteja ativada; mostra módulos, se o deviceId confere e verifica a conexão da base de negócio vinculada à chave.\n\nAutenticação: Chave.\nResposta de referência: 200: {\"conectividade\":\"ok\",\"chave\":{\"valida\":true,\"prefixo\":\"d7v_hml_…\",\"ambiente\":\"producao\",\"modulos\":[\"forca_venda\"],\"vinculada\":true,\"dispositivoConfere\":true},\"banco\":\"ok\",\"bancoNegocio\":\"EmpresaExemplo\",\"latenciaBancoMs\":12,\"servidor\":{\"versao\":\"0.2.6\"}}","operationId":"op-get-api-v1-diagnostico","tags":["Saúde e diagnóstico"],"security":[{"ApiKey":[]}],"responses":{"200":{"description":"200: {\"conectividade\":\"ok\",\"chave\":{\"valida\":true,\"prefixo\":\"d7v_hml_…\",\"ambiente\":\"producao\",\"modulos\":[\"forca_venda\"],\"vinculada\":true,\"dispositivoConfere\":true},\"banco\":\"ok\",\"bancoNegocio\":\"EmpresaExemplo\",\"latenciaBancoMs\":12,\"servidor\":{\"versao\":\"0.2.6\"}}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/dispositivos/ativar":{"post":{"summary":"Ativar licença neste dispositivo","description":"Primeiro vínculo da chave ao aparelho. Envie deviceId único (mínimo 8 caracteres); a ativação retorna o nome da empresa vinculada, filial e módulos habilitados.\n\nAutenticação: Chave sem ativação.\nResposta de referência: 200: {\"ativado\":true,\"jaEstavaAtivada\":false,\"nomeEmpresa\":\"Empresa Exemplo\",\"modulos\":[\"forca_venda\"],\"codEmpresa\":1,\"codFilial\":1}","operationId":"op-post-api-v1-dispositivos-ativar","tags":["Ativação do dispositivo"],"security":[{"ApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"deviceId":"bluestacks-device-001","nomeDispositivo":"BlueStacks","modeloDispositivo":"BlueStacks","versaoSO":"Android 13","versaoApp":"1.0.0"}}}},"responses":{"200":{"description":"200: {\"ativado\":true,\"jaEstavaAtivada\":false,\"nomeEmpresa\":\"Empresa Exemplo\",\"modulos\":[\"forca_venda\"],\"codEmpresa\":1,\"codFilial\":1}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/dispositivos/status":{"get":{"summary":"Consultar status da licença","description":"Consulta a ativação, o dispositivo associado e o nome da empresa vinculada à chave.\n\nAutenticação: Chave.\nResposta de referência: Retorna nomeEmpresa, situação atual da licença e vínculo.","operationId":"op-get-api-v1-dispositivos-status","tags":["Ativação do dispositivo"],"security":[{"ApiKey":[]}],"responses":{"200":{"description":"Retorna nomeEmpresa, situação atual da licença e vínculo."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/dispositivos/vinculo/limpar":{"post":{"summary":"Limpar vínculo sem sessão","description":"Desvincula o aparelho atual sem exigir login do usuário. Envie o device ID que está vinculado.\n\nAutenticação: Chave + dispositivo.\nResposta de referência: Retorna confirmação da operação.","operationId":"op-post-api-v1-dispositivos-vinculo-limpar","tags":["Ativação do dispositivo"],"security":[{"ApiKey":[],"DeviceId":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Retorna confirmação da operação."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/auth/login":{"post":{"summary":"Entrar com usuário e senha","description":"Autentica na empresa da chave usando o provedor configurado no servidor (ERP ou credencial da API) e cria a sessão. O limite de tentativas é aplicado por chave.\n\nAutenticação: Chave + dispositivo.\nResposta de referência: 200: {\"accessToken\":\"<JWT>\",\"refreshToken\":\"<token>\"} (o perfil/configuração do usuário também é retornado; guarde os tokens com segurança).","operationId":"op-post-api-v1-auth-login","tags":["Autenticação e sessão"],"security":[{"ApiKey":[],"DeviceId":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"login":"vendedor","senha":"SENHA_ERP"}}}},"responses":{"200":{"description":"200: {\"accessToken\":\"<JWT>\",\"refreshToken\":\"<token>\"} (o perfil/configuração do usuário também é retornado; guarde os tokens com segurança)."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/auth/refresh":{"post":{"summary":"Renovar sessão","description":"Troca o refreshToken por um novo par de tokens. Refresh tokens são rotativos e só devem ser usados uma vez.\n\nAutenticação: Chave + dispositivo.\nResposta de referência: 200: {\"accessToken\":\"<novo JWT>\",\"refreshToken\":\"<novo refresh token>\"}","operationId":"op-post-api-v1-auth-refresh","tags":["Autenticação e sessão"],"security":[{"ApiKey":[],"DeviceId":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"refreshToken":"<refreshToken-atual>"}}}},"responses":{"200":{"description":"200: {\"accessToken\":\"<novo JWT>\",\"refreshToken\":\"<novo refresh token>\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/dispositivos/vinculo":{"delete":{"summary":"Desvincular aparelho autenticado","description":"Libera a chave para ser ativada em outro aparelho. Exige sessão válida no dispositivo atual.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: Retorna confirmação da operação.","operationId":"op-delete-api-v1-dispositivos-vinculo","tags":["Ativação do dispositivo"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"Retorna confirmação da operação."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/auth/logout":{"post":{"summary":"Encerrar sessão atual","description":"Revoga imediatamente a sessão associada ao access token.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: confirmação de logout.","operationId":"op-post-api-v1-auth-logout","tags":["Autenticação e sessão"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: confirmação de logout."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/auth/me":{"get":{"summary":"Consultar usuário e permissões","description":"Retorna identidade e configuração do usuário autenticado, vendedor, empresa, filial e módulos efetivos.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: perfil/configuração da sessão.","operationId":"op-get-api-v1-auth-me","tags":["Autenticação e sessão"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: perfil/configuração da sessão."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/config":{"get":{"summary":"Obter configuração do vendedor","description":"Parâmetros de operação usados pelo app (empresa/filial, vendedor e configuração comercial).\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: objeto de configuração do vendedor.","operationId":"op-get-api-v1-config","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: objeto de configuração do vendedor."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/clientes":{"get":{"summary":"Listar e pesquisar clientes","description":"Busca trecho de nome/razão social ou fantasia, CPF/CNPJ com ou sem pontuação e código exato. A política da empresa e as exceções do usuário definem carteira ou consulta geral e visibilidade de bloqueados. Cada item informa foraCarteira, bloqueado e podeVender. Query: busca, rota, pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[…],\"total\":1,\"pagina\":1,\"tamanho\":50,\"totalPaginas\":1}","operationId":"op-get-api-v1-clientes","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…],\"total\":1,\"pagina\":1,\"tamanho\":50,\"totalPaginas\":1}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/clientes/{cod}":{"get":{"summary":"Consultar cliente","description":"Retorna o cadastro pelo código ERP respeitando a mesma política de visibilidade da lista. Inclui foraCarteira, bloqueado e podeVender.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: objeto do cliente; 404 se não visível.","operationId":"op-get-api-v1-clientes-cod","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: objeto do cliente; 404 se não visível."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/produtos":{"get":{"summary":"Listar e pesquisar produtos","description":"Query: busca, marca, grupo, pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[…],\"total\":1,\"pagina\":1,\"tamanho\":50,\"totalPaginas\":1}","operationId":"op-get-api-v1-produtos","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…],\"total\":1,\"pagina\":1,\"tamanho\":50,\"totalPaginas\":1}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/produtos/{cod}":{"get":{"summary":"Consultar produto","description":"Retorna os dados comerciais e cadastrais do produto.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: objeto do produto.","operationId":"op-get-api-v1-produtos-cod","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: objeto do produto."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/produtos/{cod}/saldo":{"get":{"summary":"Consultar estoque","description":"Query opcional local com código do local de estoque.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[…]}","operationId":"op-get-api-v1-produtos-cod-saldo","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: {\"dados\":[…]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/produtos/{cod}/imagens":{"get":{"summary":"Listar fotos do produto","description":"Lista todas as imagens anexadas ao produto, sem transferir os arquivos. Retorna id, nomeArquivo, descrição e tamanho. PDFs e outros anexos não aparecem.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[{\"id\":123,\"nomeArquivo\":\"foto.jpg\"}]}","operationId":"op-get-api-v1-produtos-cod-imagens","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: {\"dados\":[{\"id\":123,\"nomeArquivo\":\"foto.jpg\"}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/produtos/{cod}/imagens/{id}":{"get":{"summary":"Abrir foto do produto","description":"Baixa uma imagem específica pelo ID do anexo; o ID deve pertencer ao produto informado.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: conteúdo binário da imagem; 404 se não houver vínculo.","operationId":"op-get-api-v1-produtos-cod-imagens-id","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: conteúdo binário da imagem; 404 se não houver vínculo."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/produtos/{cod}/imagem":{"get":{"summary":"Baixar imagem do produto","description":"Retorna imagem binária com Content-Type detectado (JPEG, PNG, GIF ou WebP). Use a URL autenticada para renderizar/baixar a imagem.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: conteúdo binário da imagem; 404 se não houver imagem.","operationId":"op-get-api-v1-produtos-cod-imagem","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: conteúdo binário da imagem; 404 se não houver imagem."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/tabelas-preco":{"get":{"summary":"Listar tabelas de preço","description":"Lista tabelas visíveis para a sessão do vendedor.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[…]}","operationId":"op-get-api-v1-tabelas-preco","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/tabelas-preco/{cod}/itens":{"get":{"summary":"Consultar itens de uma tabela","description":"Query: busca, pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[…],\"paginacao\":{…}}","operationId":"op-get-api-v1-tabelas-preco-cod-itens","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: {\"dados\":[…],\"paginacao\":{…}}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/condicoes-pagamento":{"get":{"summary":"Listar condições de pagamento","description":"Lista as condições disponíveis ao vendedor.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[…]}","operationId":"op-get-api-v1-condicoes-pagamento","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/municipios":{"get":{"summary":"Pesquisar municípios","description":"Query: busca, pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[…]}","operationId":"op-get-api-v1-municipios","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/auxiliares":{"get":{"summary":"Carregar dados auxiliares","description":"Retorna unidades, marcas, grupos e demais listas de apoio do catálogo.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: objeto com listas auxiliares.","operationId":"op-get-api-v1-auxiliares","tags":["Catálogo e dados auxiliares"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: objeto com listas auxiliares."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/precos/calcular":{"post":{"summary":"Calcular preços de produtos","description":"Simulação sem gravação. Resolve preço com as regras de preço do vendedor. Corpo: itens[{codProduto,codUnidadeMedida?,codTabelaPreco?}], codCliente?, codCondicaoPagamento?, codTipoOperacao?.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"dados\":[{\"codProduto\":456,…}]}","operationId":"op-post-api-v1-precos-calcular","tags":["Cálculo e força de venda"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":123,"itens":[{"codProduto":456,"codUnidadeMedida":"UN"}]}}}},"responses":{"200":{"description":"200: {\"dados\":[{\"codProduto\":456,…}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/pedidos/calcular":{"post":{"summary":"Simular totais do pedido","description":"Sem gravar. Aceita cliente, condição, operação, frete e itens com quantidade e descontos/acréscimos.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: resumo calculado, itens, totais e validações.","operationId":"op-post-api-v1-pedidos-calcular","tags":["Cálculo e força de venda"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":123,"codCondicaoPagamento":"001","itens":[{"codProduto":456,"quantidade":2}]}}}},"responses":{"200":{"description":"200: resumo calculado, itens, totais e validações."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/pedidos/validar":{"post":{"summary":"Validar pedido antes de gravar","description":"Executa cálculo e regras de validação de negócio sem persistir o pedido.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: resultado do cálculo e apontamentos de validação.","operationId":"op-post-api-v1-pedidos-validar","tags":["Cálculo e força de venda"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":123,"itens":[{"codProduto":456,"quantidade":2}]}}}},"responses":{"200":{"description":"200: resultado do cálculo e apontamentos de validação."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/pedidos":{"get":{"summary":"Listar pedidos","description":"Escopo forca_venda:pedido:ler. Query: cliente, cancelados=true, pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: lista paginada de pedidos.","operationId":"op-get-api-v1-pedidos","tags":["Cálculo e força de venda"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: lista paginada de pedidos."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"post":{"summary":"Gravar pedido de venda","description":"Escopo forca_venda:pedido:gravar. Exige Idempotency-Key UUID. Condição de pagamento ativa é obrigatória (ou herdada do cliente). O tipo PEDIDO ativo é resolvido no ERP; o cabeçalho inicia com status A.\n\nAutenticação: Chave + dispositivo + sessão + módulo + Idempotency-Key.\nResposta de referência: 201: identificação e resultado do pedido. Reenvio idêntico inclui Idempotency-Replayed: true.","operationId":"op-post-api-v1-pedidos","tags":["Cálculo e força de venda"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"UUID para impedir duplicidade em reenvios."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":123,"codCondicaoPagamento":"1","observacao":"Entrega pela manhã","itens":[{"codProduto":456,"quantidade":2}]}}}},"responses":{"200":{"description":"201: identificação e resultado do pedido. Reenvio idêntico inclui Idempotency-Replayed: true."},"201":{"description":"201: identificação e resultado do pedido. Reenvio idêntico inclui Idempotency-Replayed: true."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/pedidos/{cod}":{"get":{"summary":"Consultar pedido","description":"Escopo forca_venda:pedido:ler. Retorna cabeçalho, itens e situação do pedido.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: objeto do pedido.","operationId":"op-get-api-v1-pedidos-cod","tags":["Cálculo e força de venda"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: objeto do pedido."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/pedidos/{cod}/cancelar":{"post":{"summary":"Cancelar pedido","description":"Escopo forca_venda:pedido:cancelar. Cancela no próprio ERP somente pedido criado pelo app, do vendedor da sessão, não faturado. Marca status C e libera a quantidade pendente de estoque.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: confirmação do cancelamento; 409 se não puder cancelar.","operationId":"op-post-api-v1-pedidos-cod-cancelar","tags":["Cálculo e força de venda"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"200: confirmação do cancelamento; 409 se não puder cancelar."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/orcamentos":{"get":{"summary":"Listar orçamentos","description":"Query: busca, carteira=1, pagina, tamanho. carteira=1 limita ao vendedor logado. Exige módulo orcamento.\n\nAutenticação: Chave + dispositivo + sessão + módulo orçamento.\nResposta de referência: 200: lista paginada com cliente, data, total e situação.","operationId":"op-get-api-v1-orcamentos","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: lista paginada com cliente, data, total e situação."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"post":{"summary":"Criar orçamento","description":"Cria orçamento com cliente, itens, quantidade e valores/descontos opcionais; valida regras e preços no serviço. codTipoOperacaoSaida é opcional (padrão: 1, VENDA). Exige módulo orcamento.\n\nAutenticação: Chave + dispositivo + sessão + módulo orçamento.\nResposta de referência: 201: {\"codOrcamento\":123,…}","operationId":"op-post-api-v1-orcamentos","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":123,"codTipoOperacaoSaida":1,"observacao":"Proposta comercial","itens":[{"codProduto":456,"quantidade":2}]}}}},"responses":{"200":{"description":"201: {\"codOrcamento\":123,…}"},"201":{"description":"201: {\"codOrcamento\":123,…}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/orcamentos/{cod}":{"get":{"summary":"Consultar orçamento","description":"Retorna cabeçalho e itens do orçamento. Exige módulo orcamento.\n\nAutenticação: Chave + dispositivo + sessão + módulo orçamento.\nResposta de referência: 200: orçamento com itens e totais.","operationId":"op-get-api-v1-orcamentos-cod","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: orçamento com itens e totais."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"put":{"summary":"Editar orçamento","description":"Substitui os dados do orçamento usando o mesmo formato de criação. codTipoOperacaoSaida é opcional; se omitido, preserva a operação atual e completa campos ausentes de orçamentos antigos da API. Exige módulo orcamento.\n\nAutenticação: Chave + dispositivo + sessão + módulo orçamento.\nResposta de referência: 200: orçamento atualizado.","operationId":"op-put-api-v1-orcamentos-cod","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":123,"itens":[{"codProduto":456,"quantidade":3}]}}}},"responses":{"200":{"description":"200: orçamento atualizado."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/orcamentos/{cod}/cancelar":{"post":{"summary":"Cancelar orçamento","description":"Cancela o orçamento se o estado e as regras do ERP permitirem. Exige módulo orcamento.\n\nAutenticação: Chave + dispositivo + sessão + módulo orçamento.\nResposta de referência: 200: confirmação do cancelamento.","operationId":"op-post-api-v1-orcamentos-cod-cancelar","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"200: confirmação do cancelamento."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/liberacoes":{"get":{"summary":"Listar liberações pendentes","description":"Consulta bloqueios/liberações. A API não aprova nem altera a liberação; o detalhe e a aprovação dependem do Agente7. Query: pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão + módulo liberação.\nResposta de referência: 200: {\"dados\":[…],\"aviso\":\"…\"}","operationId":"op-get-api-v1-liberacoes","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…],\"aviso\":\"…\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/ordens-servico":{"get":{"summary":"Listar ordens de serviço","description":"Consulta OS. Query: busca, carteira=1, pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão + módulo OS.\nResposta de referência: 200: {\"dados\":[…]}","operationId":"op-get-api-v1-ordens-servico","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"post":{"summary":"Criar OS","description":"Cria cabeçalho de OS comum no ERP, com sequência nativa e sessão SQL do usuário. Exige Idempotency-Key UUID. Não cria itens automaticamente.\n\nAutenticação: Chave + dispositivo + sessão + módulo OS + Idempotency-Key.\nResposta de referência: 201: {\"codOrdemServico\":123,\"status\":\"A\"}","operationId":"op-post-api-v1-ordens-servico","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","format":"uuid"},"description":"UUID para impedir duplicidade em reenvios."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":2932,"codTipoOperacaoSaida":3,"codCondicaoPagamento":"1","solicitacao":"Revisar equipamento","observacao":"Agendar visita"}}}},"responses":{"200":{"description":"201: {\"codOrdemServico\":123,\"status\":\"A\"}"},"201":{"description":"201: {\"codOrdemServico\":123,\"status\":\"A\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/ordens-servico/opcoes":{"get":{"summary":"Opções de cadastro de OS","description":"Lista operações de saída próprias de OS, tipos e condições de pagamento disponíveis na empresa.\n\nAutenticação: Chave + dispositivo + sessão + módulo OS.\nResposta de referência: 200: {\"operacoes\":[…],\"tipos\":[…],\"condicoes\":[…]}","operationId":"op-get-api-v1-ordens-servico-opcoes","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"operacoes\":[…],\"tipos\":[…],\"condicoes\":[…]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/ordens-servico/{cod}":{"put":{"summary":"Editar dados gerais da OS","description":"Atualiza dados gerais de uma OS aberta. Não altera peças, serviços ou despesas; não troca cliente/operação quando já há movimentos. Bloqueia OS faturada, fechada, cancelada ou vinculada à expedição.\n\nAutenticação: Chave + dispositivo + sessão + módulo OS.\nResposta de referência: 200: {\"codOrdemServico\":123,\"status\":\"A\"}; 409 se protegida.","operationId":"op-put-api-v1-ordens-servico-cod","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codCliente":2932,"codTipoOperacaoSaida":3,"solicitacao":"Revisar equipamento e emitir laudo"}}}},"responses":{"200":{"description":"200: {\"codOrdemServico\":123,\"status\":\"A\"}; 409 se protegida."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"get":{"summary":"Consultar ordem de serviço","description":"Detalhe nativo da OS: empresa/filial, cliente, valores de serviços, produtos, despesas, frete e faturado, código e descrição da condição de pagamento, tipo e operação, previsão, fechamento, faturamento, autores e cancelamento.\n\nAutenticação: Chave + dispositivo + sessão + módulo OS.\nResposta de referência: 200: objeto da OS.","operationId":"op-get-api-v1-ordens-servico-cod","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: objeto da OS."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/ordens-servico/{cod}/cancelar":{"post":{"summary":"Cancelar OS comum","description":"Registra status C, data, hora, usuário e motivo no ERP. Somente OS aberta sem itens, parcelas, faturamento ou vínculos especiais; ordens com movimentos devem ser canceladas no ERP.\n\nAutenticação: Chave + dispositivo + sessão + módulo OS.\nResposta de referência: 200: {\"codOrdemServico\":123,\"status\":\"C\"}; 409 se protegida.","operationId":"op-post-api-v1-ordens-servico-cod-cancelar","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"motivo":"Abertura em duplicidade"}}}},"responses":{"200":{"description":"200: {\"codOrdemServico\":123,\"status\":\"C\"}; 409 se protegida."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/ordens-servico/{cod}/itens":{"get":{"summary":"Consultar itens da OS","description":"Lista materiais requisitados, serviços apontados, despesas e parcelas. Limite de 200 itens por coleção. Os valores vêm do ERP sem recálculo pelo aplicativo.\n\nAutenticação: Chave + dispositivo + sessão + módulo OS.\nResposta de referência: 200: {\"requisicoes\":[…],\"servicos\":[…],\"despesas\":[…],\"parcelas\":[…]}","operationId":"op-get-api-v1-ordens-servico-cod-itens","tags":["Orçamentos, liberações e OS"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: {\"requisicoes\":[…],\"servicos\":[…],\"despesas\":[…],\"parcelas\":[…]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/integracao/modulos":{"get":{"summary":"Listar módulos liberados","description":"Retorna os módulos contratados para a chave/sessão e os recursos da API associados.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: {\"modulos\":[{\"id\":\"financeiro\",\"nome\":\"Financeiro\",\"recursos\":[…]}]}","operationId":"op-get-api-v1-integracao-modulos","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"modulos\":[{\"id\":\"financeiro\",\"nome\":\"Financeiro\",\"recursos\":[…]}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/vendas/resumo":{"get":{"summary":"Resumo de vendas nativas","description":"Totais e quantidades do dia e do mês. Escopo por empresa, filial e vendedor da sessão quando vinculado; inclui apenas operações que geram financeiro.\n\nAutenticação: Chave + dispositivo + sessão + módulo Vendas.\nResposta de referência: 200: {\"valorHoje\":0,\"valorMes\":0,\"vendasHoje\":0,\"vendasMes\":0}","operationId":"op-get-api-v1-vendas-resumo","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"valorHoje\":0,\"valorMes\":0,\"vendasHoje\":0,\"vendasMes\":0}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/vendas/realizadas":{"get":{"summary":"Listar vendas realizadas","description":"Paginado. Filtros: busca (cliente, código ou NF), de, ate (AAAA-MM-DD), cliente, pagina, tamanho.\n\nAutenticação: Chave + dispositivo + sessão + módulo Vendas.\nResposta de referência: 200: lista paginada; somente campos resumidos da venda.","operationId":"op-get-api-v1-vendas-realizadas","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: lista paginada; somente campos resumidos da venda."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/vendas/realizadas/{cod}":{"get":{"summary":"Consultar venda realizada","description":"Cabeçalho e itens da venda, filtrados pela empresa/filial da sessão.\n\nAutenticação: Chave + dispositivo + sessão + módulo Vendas.\nResposta de referência: 200: venda e itens.","operationId":"op-get-api-v1-vendas-realizadas-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: venda e itens."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/vendas/pedidos":{"get":{"summary":"Listar pedidos nativos","description":"Pedidos do módulo Venda, distintos dos pedidos da Força de Venda. Filtros: busca (número, código, observação), de, ate, status, cliente.\n\nAutenticação: Chave + dispositivo + sessão + módulo Vendas.\nResposta de referência: 200: lista paginada.","operationId":"op-get-api-v1-vendas-pedidos","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: lista paginada."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/vendas/pedidos/{cod}":{"get":{"summary":"Consultar pedido nativo","description":"Cabeçalho e itens do PedidoVenda, sempre restrito à empresa e filial autenticadas.\n\nAutenticação: Chave + dispositivo + sessão + módulo Vendas.\nResposta de referência: 200: pedido e itens.","operationId":"op-get-api-v1-vendas-pedidos-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: pedido e itens."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/financeiro/resumo":{"get":{"summary":"Resumo financeiro","description":"Aceita os mesmos filtros da lista de títulos (busca, período de vencimento, situação, pessoa e abertos); os totais refletem esses filtros.\n\nAutenticação: Chave + dispositivo + sessão + módulo Financeiro.\nResposta de referência: 200: {\"contasReceber\":{…},\"contasPagar\":{…}}","operationId":"op-get-api-v1-financeiro-resumo","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"contasReceber\":{…},\"contasPagar\":{…}}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/financeiro/contas-receber":{"get":{"summary":"Listar contas a receber","description":"Paginado; filtros busca (número, código, histórico ou nome do cliente), de, ate, status, pessoa (código do cliente), abertos=0|1. Retorna nomePessoa e codigoPessoa.\n\nAutenticação: Chave + dispositivo + sessão + módulo Financeiro.\nResposta de referência: 200: títulos com cliente, código, número, parcela, valor, saldo, datas, status, situação e histórico.","operationId":"op-get-api-v1-financeiro-contas-receber","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: títulos com cliente, código, número, parcela, valor, saldo, datas, status, situação e histórico."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/financeiro/contas-receber/{cod}":{"get":{"summary":"Consultar conta a receber","description":"Inclui recebimentos registrados. Esta rota não baixa títulos.\n\nAutenticação: Chave + dispositivo + sessão + módulo Financeiro.\nResposta de referência: 200: título e histórico de recebimentos.","operationId":"op-get-api-v1-financeiro-contas-receber-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: título e histórico de recebimentos."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/financeiro/contas-pagar":{"get":{"summary":"Listar contas a pagar","description":"Paginado; filtros busca (número, código, histórico ou nome do fornecedor), de, ate, status, pessoa (código do fornecedor), abertos=0|1. Retorna nomePessoa e codigoPessoa.\n\nAutenticação: Chave + dispositivo + sessão + módulo Financeiro.\nResposta de referência: 200: títulos com fornecedor, código, número, parcela, valor, saldo, datas, status, situação e histórico.","operationId":"op-get-api-v1-financeiro-contas-pagar","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: títulos com fornecedor, código, número, parcela, valor, saldo, datas, status, situação e histórico."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/financeiro/contas-pagar/{cod}":{"get":{"summary":"Consultar conta a pagar","description":"Inclui pagamentos registrados e, quando preenchida e disponível na base ERP, a linha digitável do boleto. Esta rota não liquida títulos.\n\nAutenticação: Chave + dispositivo + sessão + módulo Financeiro.\nResposta de referência: 200: título, pagamentos e linhaDigitavel opcional.","operationId":"op-get-api-v1-financeiro-contas-pagar-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: título, pagamentos e linhaDigitavel opcional."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/financeiro/movimentacoes":{"get":{"summary":"Listar movimentos financeiros","description":"Paginado; filtros busca (histórico, conta, tipo ou código), de, ate, conta e periodo.\n\nAutenticação: Chave + dispositivo + sessão + módulo Financeiro.\nResposta de referência: 200: movimentações resumidas.","operationId":"op-get-api-v1-financeiro-movimentacoes","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: movimentações resumidas."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/caixa/resumo":{"get":{"summary":"Resumo dos caixas","description":"Quantidade de períodos, caixas abertos, saldo de abertura e sangrias.\n\nAutenticação: Chave + dispositivo + sessão + módulo Caixa.\nResposta de referência: 200: indicadores agregados.","operationId":"op-get-api-v1-caixa-resumo","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: indicadores agregados."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/caixa/periodos":{"get":{"summary":"Listar períodos de caixa","description":"Paginado; filtros busca (código, conta, usuário), de, ate e abertos=1.\n\nAutenticação: Chave + dispositivo + sessão + módulo Caixa.\nResposta de referência: 200: períodos e totais de fechamento.","operationId":"op-get-api-v1-caixa-periodos","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: períodos e totais de fechamento."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/caixa/periodos/{cod}/movimentacoes":{"get":{"summary":"Consultar movimentos do período","description":"Paginado e restrito ao período da empresa autenticada.\n\nAutenticação: Chave + dispositivo + sessão + módulo Caixa.\nResposta de referência: 200: movimentos sem alteração do caixa.","operationId":"op-get-api-v1-caixa-periodos-cod-movimentacoes","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: movimentos sem alteração do caixa."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/fiscal/notas-saida":{"get":{"summary":"Listar notas de saída","description":"Paginado; filtros busca (número, série, chave ou cliente), de, ate e canceladas=1. Não retorna XML fiscal.\n\nAutenticação: Chave + dispositivo + sessão + módulo Fiscal.\nResposta de referência: 200: notas com valores e identificação fiscal.","operationId":"op-get-api-v1-fiscal-notas-saida","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: notas com valores e identificação fiscal."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/fiscal/notas-saida/{cod}":{"get":{"summary":"Consultar nota de saída","description":"Campos fiscais resumidos; XML não é exposto por este recurso.\n\nAutenticação: Chave + dispositivo + sessão + módulo Fiscal.\nResposta de referência: 200: nota fiscal.","operationId":"op-get-api-v1-fiscal-notas-saida-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: nota fiscal."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/fiscal/documentos":{"get":{"summary":"Listar documentos fiscais","description":"Paginado; filtros busca (número, série, chave, tipo ou situação), de e ate. Não permite emitir, cancelar ou transmitir documentos.\n\nAutenticação: Chave + dispositivo + sessão + módulo Fiscal.\nResposta de referência: 200: documentos fiscais resumidos.","operationId":"op-get-api-v1-fiscal-documentos","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: documentos fiscais resumidos."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/compras/pedidos":{"get":{"summary":"Listar pedidos de compra","description":"Paginado; filtros busca (código, fornecedor, situação ou observação), de, ate, status, fornecedor.\n\nAutenticação: Chave + dispositivo + sessão + módulo Compras.\nResposta de referência: 200: lista paginada de pedidos de compra.","operationId":"op-get-api-v1-compras-pedidos","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: lista paginada de pedidos de compra."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/compras/pedidos/{cod}":{"get":{"summary":"Consultar pedido de compra","description":"Cabeçalho e itens recebidos/pendentes, restritos à empresa/filial.\n\nAutenticação: Chave + dispositivo + sessão + módulo Compras.\nResposta de referência: 200: pedido de compra e itens.","operationId":"op-get-api-v1-compras-pedidos-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: pedido de compra e itens."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/compras/realizadas":{"get":{"summary":"Listar compras registradas","description":"Consulta documentos de entrada do módulo nativo Compra, paginada e restrita à empresa/filial; aceita filtros de data, fornecedor, situação (S/N) e busca.\n\nAutenticação: Chave + dispositivo + sessão + módulo Compras.\nResposta de referência: 200: compras com documento, fornecedor, cancelamento e totais.","operationId":"op-get-api-v1-compras-realizadas","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: compras com documento, fornecedor, cancelamento e totais."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/compras/realizadas/{cod}":{"get":{"summary":"Consultar compra registrada","description":"Consulta cabeçalho e itens de um documento de entrada, restrito à empresa/filial.\n\nAutenticação: Chave + dispositivo + sessão + módulo Compras.\nResposta de referência: 200: compra e itens registrados.","operationId":"op-get-api-v1-compras-realizadas-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: compra e itens registrados."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/relatorios/catalogo":{"get":{"summary":"Listar relatórios disponíveis","description":"Retorna identificadores e nomes configurados no ERP. SQL salvo pelo usuário não é executado nem retornado.\n\nAutenticação: Chave + dispositivo + sessão + módulo Relatórios.\nResposta de referência: 200: {\"dados\":[…],\"execucaoSQLDisponivel\":false}","operationId":"op-get-api-v1-relatorios-catalogo","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[…],\"execucaoSQLDisponivel\":false}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/resumo":{"get":{"summary":"Resumo da gestão","description":"Vendas realizadas são calculadas pela tabela ProdutoVendido; pedidos consideram apenas PedidoVenda sem cancelamento. Escopo por empresa/filial e carteira=1 opcional. O ticket médio divide as vendas realizadas pelo número de transações.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"vendasHoje\":0,\"transacoesHoje\":0,\"pedidosHoje\":0,\"vendasMes\":0,\"transacoesMes\":0,\"pedidosMes\":0,\"vendas30d\":0,\"transacoes30d\":0,\"pedidos30d\":0,\"vendasTotal\":0,\"transacoesTotal\":0,\"pedidosTotal\":0,\"ticketMedioMes\":0}","operationId":"op-get-api-v1-gestao-resumo","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"vendasHoje\":0,\"transacoesHoje\":0,\"pedidosHoje\":0,\"vendasMes\":0,\"transacoesMes\":0,\"pedidosMes\":0,\"vendas30d\":0,\"transacoes30d\":0,\"pedidos30d\":0,\"vendasTotal\":0,\"transacoesTotal\":0,\"pedidosTotal\":0,\"ticketMedioMes\":0}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/dre":{"get":{"summary":"Consultar DRE","description":"Query ano, mesInicial e mesFinal. A fonte da empresa escolhe Customizado.ViewDRE (natureza financeira) ou Customizado.ViewDREContaContabil (conta contábil). Ambas retornam o mesmo contrato, com fonteDre e rotuloClassificacao. Por competência e empresa, sem escopo de filial. Resultado parcial se faltar classificação ou origem de títulos.\n\nAutenticação: Chave + dispositivo + sessão + módulos Gestão e Financeiro.\nResposta de referência: 200: {\"disponivel\":true,\"fonteDre\":\"NATUREZA_FINANCEIRA\",\"configurada\":false,\"completa\":false,\"cobertura\":{\"movimentos\":0,\"movimentosSemClassificacao\":0},\"linhas\":[],\"naturezasPendentes\":[]}","operationId":"op-get-api-v1-gestao-dre","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"disponivel\":true,\"fonteDre\":\"NATUREZA_FINANCEIRA\",\"configurada\":false,\"completa\":false,\"cobertura\":{\"movimentos\":0,\"movimentosSemClassificacao\":0},\"linhas\":[],\"naturezasPendentes\":[]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/dre/conciliacao":{"get":{"summary":"Cobertura da conciliação DRE","description":"Query ano, mesInicial e mesFinal. Lista operações concluídas, títulos por origem, custo candidato dos itens e contratos FC por competência. A prévia não soma títulos às vendas e não publica resultado líquido.\n\nAutenticação: Chave + dispositivo + sessão + módulos Gestão e Financeiro.\nResposta de referência: 200: {\"instalada\":true,\"disponivel\":false,\"estado\":\"CONCILIACAO\",\"cobertura\":{\"fatos\":0,\"classificados\":0,\"titulos\":0},\"operacoes\":[],\"titulos\":[],\"custos\":[],\"contratos\":[]}","operationId":"op-get-api-v1-gestao-dre-conciliacao","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"instalada\":true,\"disponivel\":false,\"estado\":\"CONCILIACAO\",\"cobertura\":{\"fatos\":0,\"classificados\":0,\"titulos\":0},\"operacoes\":[],\"titulos\":[],\"custos\":[],\"contratos\":[]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/preferencias/painel":{"get":{"summary":"Consultar painel do usuário","description":"Retorna a ordem e as seções visíveis salvas para o usuário na empresa. Null usa a disposição padrão.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"secoes\":[\"destaque\",\"grafico\",\"indicadores\"]}","operationId":"op-get-api-v1-gestao-preferencias-painel","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"secoes\":[\"destaque\",\"grafico\",\"indicadores\"]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"put":{"summary":"Personalizar painel do usuário","description":"Salva a ordem das seções visíveis na conta do usuário da empresa. Aceita de 1 a 8 identificadores únicos: destaque, grafico, indicadores, modulos, panorama, clientes, produtos, vendedores.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"secoes\":[\"destaque\",\"grafico\",\"indicadores\"]}","operationId":"op-put-api-v1-gestao-preferencias-painel","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"secoes":["destaque","grafico","indicadores"]}}}},"responses":{"200":{"description":"200: {\"secoes\":[\"destaque\",\"grafico\",\"indicadores\"]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/comparativo":{"get":{"summary":"Comparar mês atual e anterior","description":"Valores e percentual de variação das vendas mensais. Query opcional carteira=1.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"vendasMes\":0,\"vendasMesAnterior\":0,\"variacaoPercent\":0}","operationId":"op-get-api-v1-gestao-comparativo","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"vendasMes\":0,\"vendasMesAnterior\":0,\"variacaoPercent\":0}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/panorama":{"get":{"summary":"Consultar panorama da empresa","description":"Clientes/produtos ativos, orçamentos e OS no mês, novos clientes em 30 dias. rotuloOrcamento vem do cadastro da empresa (ORCAMENTO ou CONDICIONAL).\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"clientesAtivos\":0,\"produtosAtivos\":0,\"orcamentosMes\":0,\"rotuloOrcamento\":\"ORCAMENTO\",\"osMes\":0,\"novosClientes30d\":0}","operationId":"op-get-api-v1-gestao-panorama","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"clientesAtivos\":0,\"produtosAtivos\":0,\"orcamentosMes\":0,\"rotuloOrcamento\":\"ORCAMENTO\",\"osMes\":0,\"novosClientes30d\":0}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/vendas-diarias":{"get":{"summary":"Série diária de vendas","description":"Query dias (1–90, padrão 14). dias=1 retorna somente hoje; carteira=1 opcional.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"dados\":[{\"dia\":\"2026-09-28\",\"valor\":0,\"pedidos\":0}]}","operationId":"op-get-api-v1-gestao-vendas-diarias","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[{\"dia\":\"2026-09-28\",\"valor\":0,\"pedidos\":0}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/top-produtos":{"get":{"summary":"Ranking de produtos","description":"Query dias (1–365, padrão 90) e carteira=1 opcional. Inclui o código do produto e a unidade de medida cadastrada no ERP.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"dados\":[{\"codProduto\":456,\"nome\":\"Produto\",\"codUnidadeMedida\":\"UN\",\"unidadeMedida\":\"UNIDADE\",\"quantidade\":2,\"valor\":100}]}","operationId":"op-get-api-v1-gestao-top-produtos","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[{\"codProduto\":456,\"nome\":\"Produto\",\"codUnidadeMedida\":\"UN\",\"unidadeMedida\":\"UNIDADE\",\"quantidade\":2,\"valor\":100}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/top-clientes":{"get":{"summary":"Ranking de clientes","description":"Query dias (1–365, padrão 90) e carteira=1 opcional.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"dados\":[{\"codCliente\":123,\"nome\":\"Cliente\",\"valor\":100,\"pedidos\":1}]}","operationId":"op-get-api-v1-gestao-top-clientes","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[{\"codCliente\":123,\"nome\":\"Cliente\",\"valor\":100,\"pedidos\":1}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/gestao/top-vendedores":{"get":{"summary":"Ranking de vendedores","description":"Query dias (1–365, padrão 30). Visão da empresa. Considera somente vendas cujo tipo de operação de saída está configurado com GeraFinanceiro=S.\n\nAutenticação: Chave + dispositivo + sessão + módulo Gestão.\nResposta de referência: 200: {\"dados\":[{\"codVendedor\":1,\"nome\":\"Vendedor\",\"valor\":100,\"pedidos\":1}]}","operationId":"op-get-api-v1-gestao-top-vendedores","tags":["Gestão empresarial"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: {\"dados\":[{\"codVendedor\":1,\"nome\":\"Vendedor\",\"valor\":100,\"pedidos\":1}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/resumo":{"get":{"summary":"Resumo administrativo","description":"Contadores gerais de licenças.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"dados\":{…}}","operationId":"op-get-api-v1-admin-resumo","tags":["Administração"],"security":[{"AdminToken":[]}],"responses":{"200":{"description":"200: {\"dados\":{…}}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas":{"get":{"summary":"Listar empresas e bancos","description":"Lista empresas configuradas e lê a versão do Data7 na última linha de dbo.HistoricoAtualizacaoVersao de cada banco. versaoData7 fica nula quando não existe registro ou a consulta está indisponível; versaoData7Erro distingue a falha.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"dados\":[{\"nome\":\"Empresa Exemplo\",\"versaoData7\":\"1.579.213\",\"dataVersaoData7\":\"2026-08-28\",\"versaoData7Erro\":false}]}","operationId":"op-get-api-v1-admin-empresas","tags":["Administração"],"security":[{"AdminToken":[]}],"responses":{"200":{"description":"200: {\"dados\":[{\"nome\":\"Empresa Exemplo\",\"versaoData7\":\"1.579.213\",\"dataVersaoData7\":\"2026-08-28\",\"versaoData7Erro\":false}]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"post":{"summary":"Cadastrar empresa/banco","description":"Configure conexão independente para cada empresa. Senhas nunca devem ser incluídas em logs ou exemplos reais.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 201: empresa cadastrada (sem expor senha).","operationId":"op-post-api-v1-admin-empresas","tags":["Administração"],"security":[{"AdminToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"nome":"Empresa Exemplo","dbServer":"192.168.1.10","dbDatabase":"EmpresaExemplo","dbUser":"api_user","dbPassword":"<senha>","dbPort":1433,"codEmpresaData7":1,"codFilialData7":1,"ativo":true}}}},"responses":{"200":{"description":"201: empresa cadastrada (sem expor senha)."},"201":{"description":"201: empresa cadastrada (sem expor senha)."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/instalar":{"post":{"summary":"Instalar estrutura DRE","description":"Cria ou atualiza a tabela Customizado.ClassificacaoNaturezaDRE e a view Customizado.ViewDRE no banco da empresa, sem classificar naturezas automaticamente.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"instalada\":true,\"banco\":\"EmpresaExemplo\"}","operationId":"op-post-api-v1-admin-empresas-id-dre-instalar","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"instalada\":true,\"banco\":\"EmpresaExemplo\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/contabil/instalar":{"post":{"summary":"Instalar DRE contábil","description":"Cria Customizado.ConfiguracaoDREContaContabil, Customizado.ClassificacaoContaContabilDRE e Customizado.ViewDREContaContabil. Não troca a fonte ativa nem classifica contas.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"instalada\":true,\"view\":\"Customizado.ViewDREContaContabil\"}","operationId":"op-post-api-v1-admin-empresas-id-dre-contabil-instalar","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"instalada\":true,\"view\":\"Customizado.ViewDREContaContabil\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/conciliacao/instalar":{"post":{"summary":"Instalar conciliação DRE","description":"Cria Customizado.RegraDREOperacao e Customizado.ViewDREConciliacaoVendas, sem alterar títulos, vendas ou a fonte ativa.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"instalada\":true,\"view\":\"Customizado.ViewDREConciliacaoVendas\"}","operationId":"op-post-api-v1-admin-empresas-id-dre-conciliacao-instalar","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"instalada\":true,\"view\":\"Customizado.ViewDREConciliacaoVendas\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/conciliacao":{"get":{"summary":"Prévia da conciliação","description":"Query ano. Cobertura de vendas e OS por operação e títulos por origem, sem tratá-los como receita adicional.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"instalada\":true,\"disponivel\":false,\"cobertura\":{},\"operacoes\":[],\"titulos\":[]}","operationId":"op-get-api-v1-admin-empresas-id-dre-conciliacao","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"instalada\":true,\"disponivel\":false,\"cobertura\":{},\"operacoes\":[],\"titulos\":[]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/conciliacao/regras":{"get":{"summary":"Listar regras da conciliação","description":"Lista tipos de operação financeira e contas analíticas ativas elegíveis.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"instalada\":true,\"operacoes\":[],\"contas\":[]}","operationId":"op-get-api-v1-admin-empresas-id-dre-conciliacao-regras","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"instalada\":true,\"operacoes\":[],\"contas\":[]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/conciliacao/regras/{codTipo}":{"put":{"summary":"Aprovar operação da conciliação","description":"Associa operação financeira a conta analítica ativa. Receita usa conta credora e soma; devolução aprovada como dedução usa conta devedora e subtrai. Não altera o ERP.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: regra aprovada.","operationId":"op-put-api-v1-admin-empresas-id-dre-conciliacao-regras-codTipo","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."},{"name":"codTipo","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador codTipo do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"grupo":"RECEITA_BRUTA","codContaContabil":98}}}},"responses":{"200":{"description":"200: regra aprovada."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"delete":{"summary":"Remover regra da conciliação","description":"Retorna a operação ao estado pendente sem alterar as vendas e títulos do ERP.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"removida\":true}","operationId":"op-delete-api-v1-admin-empresas-id-dre-conciliacao-regras-codTipo","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."},{"name":"codTipo","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador codTipo do recurso."}],"responses":{"200":{"description":"200: {\"removida\":true}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/contabil/configuracao":{"get":{"summary":"Consultar origem contábil","description":"Mostra o mapeamento e a cobertura de contas em lançamentos, títulos e rateios.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"instalada\":true,\"configuracao\":null,\"cobertura\":{}}","operationId":"op-get-api-v1-admin-empresas-id-dre-contabil-configuracao","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"instalada\":true,\"configuracao\":null,\"cobertura\":{}}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"put":{"summary":"Configurar origem contábil","description":"Escolhe uma origem aprovada: MovimentoContabil ou títulos. Para títulos, seleciona conta do próprio título ou rateio e data de emissão, vencimento, baixa ou competência. Não aceita SQL livre.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: configuração e cobertura.","operationId":"op-put-api-v1-admin-empresas-id-dre-contabil-configuracao","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"origem":"TITULOS","fontePagar":"RATEIO","fonteReceber":"DESATIVADO","dataPagar":"EMISSAO","dataReceber":"EMISSAO"}}}},"responses":{"200":{"description":"200: configuração e cobertura."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/contabil/contas":{"get":{"summary":"Listar contas DRE","description":"Lista contas contábeis ativas e classificação independente das naturezas.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"dados\":[],\"grupos\":{}}","operationId":"op-get-api-v1-admin-empresas-id-dre-contabil-contas","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"dados\":[],\"grupos\":{}}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/contabil/contas/{codConta}":{"put":{"summary":"Classificar conta contábil","description":"Define grupo, linha, ordem e sinal da conta na DRE.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: classificação salva.","operationId":"op-put-api-v1-admin-empresas-id-dre-contabil-contas-codConta","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."},{"name":"codConta","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador codConta do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"grupo":"CUSTOS","sinal":-1}}}},"responses":{"200":{"description":"200: classificação salva."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"delete":{"summary":"Remover classificação contábil","description":"Deixa a conta sem classificação na DRE.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"removida\":true}","operationId":"op-delete-api-v1-admin-empresas-id-dre-contabil-contas-codConta","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."},{"name":"codConta","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador codConta do recurso."}],"responses":{"200":{"description":"200: {\"removida\":true}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/naturezas":{"get":{"summary":"Listar classificação DRE","description":"Consulta as naturezas do ERP e sua classificação por empresa; requer a estrutura DRE instalada.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"codEmpresa\":1,\"grupos\":{},\"dados\":[]}","operationId":"op-get-api-v1-admin-empresas-id-dre-naturezas","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"codEmpresa\":1,\"grupos\":{},\"dados\":[]}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/dre/naturezas/{codNatureza}":{"put":{"summary":"Classificar natureza na DRE","description":"Define grupo, código e descrição da linha, ordem e sinal. O grupo FORA_DRE exclui a natureza do resultado.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: classificação salva.","operationId":"op-put-api-v1-admin-empresas-id-dre-naturezas-codNatureza","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."},{"name":"codNatureza","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador codNatureza do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"grupo":"RECEITA_BRUTA","codigoLinha":"VENDA","descricaoLinha":"Vendas de mercadorias","ordemLinha":10,"sinal":1}}}},"responses":{"200":{"description":"200: classificação salva."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"delete":{"summary":"Remover classificação DRE","description":"Deixa a natureza pendente na DRE da empresa.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"removida\":true}","operationId":"op-delete-api-v1-admin-empresas-id-dre-naturezas-codNatureza","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."},{"name":"codNatureza","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador codNatureza do recurso."}],"responses":{"200":{"description":"200: {\"removida\":true}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}/tipos-pedido":{"get":{"summary":"Listar tipos de pedido da empresa","description":"Consulta ForcaVenda.TipoPedidoVenda no banco cadastrado, filtrando pelo código da empresa no ERP. Exibe código, descrição, tipo e situação; tipos inativos não podem ser selecionados.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"dados\":[{\"codTipoPedidoVenda\":2,\"descricao\":\"PEDIDO DE VENDA\",\"tipo\":\"PEDIDO\",\"ativo\":true}],\"selecionado\":2}","operationId":"op-get-api-v1-admin-empresas-id-tipos-pedido","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"dados\":[{\"codTipoPedidoVenda\":2,\"descricao\":\"PEDIDO DE VENDA\",\"tipo\":\"PEDIDO\",\"ativo\":true}],\"selecionado\":2}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/tipos-pedido":{"post":{"summary":"Consultar tipos antes de cadastrar empresa","description":"Consulta tipos no banco informado sem gravar a conexão. Use servidor, banco, usuário, senha e código da empresa no ERP para preencher o dropdown de uma empresa nova.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"dados\":[…],\"codEmpresa\":1,\"selecionado\":null}","operationId":"op-post-api-v1-admin-empresas-tipos-pedido","tags":["Administração"],"security":[{"AdminToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"dbServer":"192.168.1.10","dbDatabase":"EmpresaExemplo","dbUser":"api_user","dbPassword":"<senha>","codEmpresaData7":1}}}},"responses":{"200":{"description":"200: {\"dados\":[…],\"codEmpresa\":1,\"selecionado\":null}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/{id}":{"put":{"summary":"Atualizar empresa/banco","description":"Campos parciais de conexão, política de clientes e codTipoPedidoVendaPadrao. O tipo é validado como ativo no banco do ERP e na empresa informada; null preserva a escolha automática do primeiro PEDIDO ativo.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: empresa atualizada.","operationId":"op-put-api-v1-admin-empresas-id","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"consultaTodosClientes":true,"vendaForaCarteira":false,"codTipoPedidoVendaPadrao":2}}}},"responses":{"200":{"description":"200: empresa atualizada."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/empresas/testar":{"post":{"summary":"Testar conexão com banco","description":"Envie {id} para testar empresa salva ou os campos dbServer, dbDatabase, dbUser e dbPassword (dbPort opcional) antes do cadastro. Também retorna versaoData7 lida do banco; não confunda com a versão do SQL Server.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"ok\":true,\"banco\":\"EmpresaExemplo\",\"versaoData7\":\"1.579.213\"}.","operationId":"op-post-api-v1-admin-empresas-testar","tags":["Administração"],"security":[{"AdminToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"dbServer":"192.168.1.10","dbDatabase":"EmpresaExemplo","dbUser":"api_user","dbPassword":"<senha>","dbPort":1433}}}},"responses":{"200":{"description":"200: {\"ok\":true,\"banco\":\"EmpresaExemplo\",\"versaoData7\":\"1.579.213\"}."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/chaves":{"post":{"summary":"Emitir chave de acesso","description":"empresaId é obrigatório. Módulos: forca_venda, orcamento, ordem_servico, liberacao, gestao, financeiro, caixa, fiscal, compras, estoque e relatorios. diasValidade é opcional (máximo 3650). A chave é devolvida na emissão e fica recuperável no painel, cifrada em repouso.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 201: inclui chave em texto puro; a recuperação posterior exige admin e a coluna da migração 006.","operationId":"op-post-api-v1-admin-chaves","tags":["Administração"],"security":[{"AdminToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"descricao":"App Gestão - Empresa Exemplo","empresaId":1,"modulos":["gestao","financeiro"],"diasValidade":365}}}},"responses":{"200":{"description":"201: inclui chave em texto puro; a recuperação posterior exige admin e a coluna da migração 006."},"201":{"description":"201: inclui chave em texto puro; a recuperação posterior exige admin e a coluna da migração 006."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"get":{"summary":"Listar e filtrar chaves","description":"Query: pagina, tamanho (máx. 200), ativas=true, empresaId, status (active|revoked|expired|unbound), busca.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: lista paginada/filtrada de licenças.","operationId":"op-get-api-v1-admin-chaves","tags":["Administração"],"security":[{"AdminToken":[]}],"responses":{"200":{"description":"200: lista paginada/filtrada de licenças."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/chaves/{id}":{"get":{"summary":"Consultar uma chave","description":"Retorna situação e vínculo da licença pelo ID administrativo.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: status da chave.","operationId":"op-get-api-v1-admin-chaves-id","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: status da chave."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"put":{"summary":"Editar uma chave","description":"Atualiza descrição, empresa, módulos e validade. Encerra as sessões ativas da chave; a chave não muda. Revogadas não podem ser editadas.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: licença atualizada.","operationId":"op-put-api-v1-admin-chaves-id","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"descricao":"App Gestão","empresaId":1,"modulos":["gestao","financeiro"],"dataValidade":"2027-09-28"}}}},"responses":{"200":{"description":"200: licença atualizada."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"delete":{"summary":"Revogar chave","description":"Revogação administrativa. Body opcional: motivo e por. Revogação não pode ser desfeita; emita outra chave se necessário.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: confirmação da revogação.","operationId":"op-delete-api-v1-admin-chaves-id","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"motivo":"Substituição solicitada","por":"Administrador"}}}},"responses":{"200":{"description":"200: confirmação da revogação."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/chaves/{id}/recuperar":{"post":{"summary":"Recuperar chave completa","description":"Acesso administrativo auditado. Novas chaves usam cifra autenticada AES-256-GCM. Chaves antigas, salvas apenas como hash, não podem ser recuperadas.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: chave completa; 409 para chave antiga sem cifra.","operationId":"op-post-api-v1-admin-chaves-id-recuperar","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: chave completa; 409 para chave antiga sem cifra."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/chaves/{id}/desvincular":{"post":{"summary":"Liberar dispositivo da chave","description":"Remove o vínculo atual, mantendo a licença ativa.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: confirmação.","operationId":"op-post-api-v1-admin-chaves-id-desvincular","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"200: confirmação."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/credenciais":{"get":{"summary":"Listar usuários integrados","description":"Lista logins configurados para autenticar na API. Query: pagina, tamanho (máx. 200), empresaId, busca. Senhas não são retornadas.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: lista de credenciais sem hashes/senhas.","operationId":"op-get-api-v1-admin-credenciais","tags":["Administração"],"security":[{"AdminToken":[]}],"responses":{"200":{"description":"200: lista de credenciais sem hashes/senhas."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"post":{"summary":"Criar ou atualizar usuário","description":"Configura credencial de login da API vinculada a empresa. Senha obrigatória: mínimo 8 caracteres, ao menos uma letra e um número. Campos opcionais ERP: codUsuario, codVendedor, codEmpresa, codFilial; modulos. Revoga sessões existentes ao atualizar.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 201: {\"credencialId\":1,\"login\":\"vendedor\"}","operationId":"op-post-api-v1-admin-credenciais","tags":["Administração"],"security":[{"AdminToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"login":"vendedor","senha":"Senha1234","empresaId":1,"codVendedor":1,"codUsuario":1,"modulos":["forca_venda","gestao"]}}}},"responses":{"200":{"description":"201: {\"credencialId\":1,\"login\":\"vendedor\"}"},"201":{"description":"201: {\"credencialId\":1,\"login\":\"vendedor\"}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/credenciais/{id}":{"put":{"summary":"Editar usuário e redefinir senha","description":"Atualiza login, empresa, vínculo ERP, módulos e exceções de política de clientes. Os quatro campos de política aceitam true, false ou null para herdar da empresa. Senha é opcional; se enviada, exige oito caracteres, uma letra e um número. Sessões são encerradas.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: usuário atualizado.","operationId":"op-put-api-v1-admin-credenciais-id","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"login":"vendedor","empresaId":1,"codVendedor":1,"codUsuario":1,"modulos":null,"consultaTodosClientes":true,"vendaForaCarteira":false}}}},"responses":{"200":{"description":"200: usuário atualizado."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"delete":{"summary":"Remover usuário","description":"Remove a credencial e revoga todas as sessões ativas.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"credencialId\":1,\"removida\":true}","operationId":"op-delete-api-v1-admin-credenciais-id","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"responses":{"200":{"description":"200: {\"credencialId\":1,\"removida\":true}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/credenciais/{id}/status":{"patch":{"summary":"Ativar ou desativar usuário","description":"Body {ativo:boolean}. Desativar revoga as sessões existentes do usuário.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: {\"credencialId\":1,\"ativo\":false}","operationId":"op-patch-api-v1-admin-credenciais-id-status","tags":["Administração"],"security":[{"AdminToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador id do recurso."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"ativo":false}}}},"responses":{"200":{"description":"200: {\"credencialId\":1,\"ativo\":false}"},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/admin/auditoria":{"get":{"summary":"Consultar auditoria","description":"Query: pagina, tamanho (máx. 200), chaveAcessoId, resultado.\n\nAutenticação: X-Admin-Token.\nResposta de referência: 200: lista paginada de eventos de auditoria.","operationId":"op-get-api-v1-admin-auditoria","tags":["Administração"],"security":[{"AdminToken":[]}],"responses":{"200":{"description":"200: lista paginada de eventos de auditoria."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/integracao/capacidades":{"get":{"summary":"Consultar estrutura dos módulos licenciados","description":"Verifica tabelas presentes na base da chave e apresenta contratos candidatos, explicitamente marcados como planejados. Presença estrutural não autoriza gravação.\n\nAutenticação: Chave + dispositivo + sessão.\nResposta de referência: 200: módulos, tabelas presentes/ausentes e dependências da expansão.","operationId":"op-get-api-v1-integracao-capacidades","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: módulos, tabelas presentes/ausentes e dependências da expansão."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/integracao/capacidades-cadastros":{"get":{"summary":"Consultar compatibilidade dos cadastros","description":"Verifica colunas, chave primária, estado do banco e assinaturas das triggers de Marca e UnidadeMedida. Escrita com trigger personalizada não revisada é bloqueada.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: cadastros, compatibilidade e motivos.","operationId":"op-get-api-v1-integracao-capacidades-cadastros","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: cadastros, compatibilidade e motivos."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/cadastros/marcas":{"get":{"summary":"Listar marcas","description":"Query: busca, pagina, tamanho (máximo 100). Cadastro global da base selecionada pela chave, compartilhado pelas empresas internas desse banco.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: dados, total, pagina e tamanho.","operationId":"op-get-api-v1-cadastros-marcas","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: dados, total, pagina e tamanho."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"post":{"summary":"Incluir marcas","description":"Exige também X-Admin-Token e X-Motivo (5–200 caracteres). Marca usa dbo.ProximoCodigo com sequência previamente configurada. Unidade recebe código explícito. Não repetir POST de marca automaticamente após timeout; ainda não tem idempotência.\n\nAutenticação: Chave + dispositivo + sessão + módulo + X-Admin-Token.\nResposta de referência: 201: cadastro criado e versao.","operationId":"op-post-api-v1-cadastros-marcas","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[],"AdminToken":[]}],"parameters":[{"name":"X-Motivo","in":"header","required":true,"schema":{"type":"string","minLength":5,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"nome":"Marca exemplo"}}}},"responses":{"200":{"description":"201: cadastro criado e versao."},"201":{"description":"201: cadastro criado e versao."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/cadastros/marcas/{cod}":{"get":{"summary":"Consultar marcas","description":"Retorna versão do registro no corpo e no header ETag; use o valor completo em If-Match para editar/excluir.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: cadastro e versao.","operationId":"op-get-api-v1-cadastros-marcas-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: cadastro e versao."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"patch":{"summary":"Editar marcas","description":"Exige X-Motivo e If-Match. Marca: somente nome. Unidade: descricao/ativo; código e regra de fracionamento não são alteráveis. Gravação transacional com verificação de versão.\n\nAutenticação: Chave + dispositivo + sessão + módulo + X-Admin-Token.\nResposta de referência: 200: cadastro atualizado. 412: versão mudou. 428: If-Match ausente.","operationId":"op-patch-api-v1-cadastros-marcas-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[],"AdminToken":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."},{"name":"X-Motivo","in":"header","required":true,"schema":{"type":"string","minLength":5,"maxLength":200}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"},"description":"ETag completo, incluindo as aspas, devolvido pela consulta."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"nome":"Marca atualizada"}}}},"responses":{"200":{"description":"200: cadastro atualizado. 412: versão mudou. 428: If-Match ausente."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"delete":{"summary":"Excluir marcas","description":"Exige X-Motivo e If-Match. Recusa cadastro com vínculos, inclusive referências convencionais sem FK; não executa exclusão em cascata. Para unidade em uso, utilize PATCH ativo=false.\n\nAutenticação: Chave + dispositivo + sessão + módulo + X-Admin-Token.\nResposta de referência: 200: {codigo,excluido:true}. 409: vínculo ou estrutura incompatível.","operationId":"op-delete-api-v1-cadastros-marcas-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[],"AdminToken":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."},{"name":"X-Motivo","in":"header","required":true,"schema":{"type":"string","minLength":5,"maxLength":200}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"},"description":"ETag completo, incluindo as aspas, devolvido pela consulta."}],"responses":{"200":{"description":"200: {codigo,excluido:true}. 409: vínculo ou estrutura incompatível."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/cadastros/unidades-medida":{"get":{"summary":"Listar unidades-medida","description":"Query: busca, pagina, tamanho (máximo 100). Cadastro global da base selecionada pela chave, compartilhado pelas empresas internas desse banco.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: dados, total, pagina e tamanho.","operationId":"op-get-api-v1-cadastros-unidades-medida","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"responses":{"200":{"description":"200: dados, total, pagina e tamanho."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"post":{"summary":"Incluir unidades-medida","description":"Exige também X-Admin-Token e X-Motivo (5–200 caracteres). Marca usa dbo.ProximoCodigo com sequência previamente configurada. Unidade recebe código explícito. Não repetir POST de marca automaticamente após timeout; ainda não tem idempotência.\n\nAutenticação: Chave + dispositivo + sessão + módulo + X-Admin-Token.\nResposta de referência: 201: cadastro criado e versao.","operationId":"op-post-api-v1-cadastros-unidades-medida","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[],"AdminToken":[]}],"parameters":[{"name":"X-Motivo","in":"header","required":true,"schema":{"type":"string","minLength":5,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"codigo":"CX","descricao":"Caixa","ativo":true,"permiteVendaFracionada":false}}}},"responses":{"200":{"description":"201: cadastro criado e versao."},"201":{"description":"201: cadastro criado e versao."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}},"/api/v1/cadastros/unidades-medida/{cod}":{"get":{"summary":"Consultar unidades-medida","description":"Retorna versão do registro no corpo e no header ETag; use o valor completo em If-Match para editar/excluir.\n\nAutenticação: Chave + dispositivo + sessão + módulo.\nResposta de referência: 200: cadastro e versao.","operationId":"op-get-api-v1-cadastros-unidades-medida-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."}],"responses":{"200":{"description":"200: cadastro e versao."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"patch":{"summary":"Editar unidades-medida","description":"Exige X-Motivo e If-Match. Marca: somente nome. Unidade: descricao/ativo; código e regra de fracionamento não são alteráveis. Gravação transacional com verificação de versão.\n\nAutenticação: Chave + dispositivo + sessão + módulo + X-Admin-Token.\nResposta de referência: 200: cadastro atualizado. 412: versão mudou. 428: If-Match ausente.","operationId":"op-patch-api-v1-cadastros-unidades-medida-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[],"AdminToken":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."},{"name":"X-Motivo","in":"header","required":true,"schema":{"type":"string","minLength":5,"maxLength":200}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"},"description":"ETag completo, incluindo as aspas, devolvido pela consulta."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"descricao":"Caixa","ativo":false}}}},"responses":{"200":{"description":"200: cadastro atualizado. 412: versão mudou. 428: If-Match ausente."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}},"delete":{"summary":"Excluir unidades-medida","description":"Exige X-Motivo e If-Match. Recusa cadastro com vínculos, inclusive referências convencionais sem FK; não executa exclusão em cascata. Para unidade em uso, utilize PATCH ativo=false.\n\nAutenticação: Chave + dispositivo + sessão + módulo + X-Admin-Token.\nResposta de referência: 200: {codigo,excluido:true}. 409: vínculo ou estrutura incompatível.","operationId":"op-delete-api-v1-cadastros-unidades-medida-cod","tags":["Módulos nativos ERP"],"security":[{"ApiKey":[],"DeviceId":[],"BearerAuth":[],"AdminToken":[]}],"parameters":[{"name":"cod","in":"path","required":true,"schema":{"type":"string"},"description":"Identificador cod do recurso."},{"name":"X-Motivo","in":"header","required":true,"schema":{"type":"string","minLength":5,"maxLength":200}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"},"description":"ETag completo, incluindo as aspas, devolvido pela consulta."}],"responses":{"200":{"description":"200: {codigo,excluido:true}. 409: vínculo ou estrutura incompatível."},"400":{"description":"Requisição inválida. Formato: {\"erro\":{\"codigo\":\"REQUISICAO_INVALIDA\",\"mensagem\":\"…\"}}"},"401":{"description":"Chave ou sessão ausente, inválida ou expirada."},"403":{"description":"Sem permissão ou módulo não liberado."},"404":{"description":"Recurso não encontrado."},"409":{"description":"Conflito de estado, vínculo ou estrutura incompatível."},"412":{"description":"Registro alterado desde a consulta."},"428":{"description":"Header If-Match obrigatório."},"429":{"description":"Limite de requisições excedido."},"500":{"description":"Erro interno genérico."},"503":{"description":"Banco indisponível."}}}}},"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-API-Key"},"DeviceId":{"type":"apiKey","in":"header","name":"X-Device-Id"},"BearerAuth":{"type":"http","scheme":"bearer"},"AdminToken":{"type":"apiKey","in":"header","name":"X-Admin-Token"}}}}