1. Base URL
Todas as requisições devem ser feitas para a seguinte URL base em produção (o Gateway Nginx):
https://nginx-production-6d15.up.railway.appReferência oficial da API REST do ContaUp — endpoints, parâmetros, exemplos de request/response e regras de autenticação, módulo por módulo.
Todas as requisições devem ser feitas para a seguinte URL base em produção (o Gateway Nginx):
https://nginx-production-6d15.up.railway.appPOST /auth/registrar-dono.POST /auth/login e guardar o token.POST /empresas.Para garantir resiliência contra ataques de força bruta, implementamos um API Gateway na nuvem (Railway) usando Nginx. Ele atua como um Proxy Reverso com Rate Limiting estrito configurado para 5 requisições/segundo por IP.
Bloqueio Automático (Rate Limit)Qualquer tentativa de sobrecarregar a API com múltiplas requisições simultâneas (acima de 10 requests em rajada) será interceptada antes de atingir o servidor Node.js. O Nginx derruba a conexão instantaneamente para economizar CPU/Memória do Backend.
Sem corpo de requisição.
<html>
<head><title>429 Too Many Requests</title></head>
<body>
<center><h1>429 Too Many Requests</h1></center>
<hr><center>nginx</center>
</body>
</html>Atenção
Login e cadastro inicial de donos. /login e /registrar-dono são as únicas rotas públicas deste módulo. Cadastro de funcionário (/registrar-usuario) exige token e cargo DONO.
/auth/loginAutentica via Supabase Auth e retorna o token JWT junto com os dados básicos do usuário.
{
"email": "carlos@acmecorp.com",
"senha": "senha123"
}{
"status": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsIn...",
"usuario": { "id": "uuid", "nome": "string", "email": "string" }
}
}/auth/registrar-donoCria o usuário inicial com cargo DONO, ainda sem empresa vinculada. O fluxo de onboarding completo é: registrar o dono aqui → fazer login → criar a empresa em POST /empresas.
{
"nome": "Carlos Gestor",
"email": "carlos@acmecorp.com",
"senha": "senha123"
}{
"status": "success",
"message": "Dono registrado com sucesso!"
}Atenção
/auth/registrar-usuarioCria um funcionário (cargo definido pelo dono) já vinculado à empresa do usuário autenticado. A empresa é sempre a do dono que faz a chamada — empresa_id não é aceito no body, evitando que um cliente vincule o novo usuário a outra empresa.
{
"nome": "Maria Caixa",
"email": "maria@acmecorp.com",
"senha": "senha123",
"cargo": "CAIXA"
}{
"status": "success",
"message": "Funcionário registrado com sucesso!",
"data": { "id": "uuid" }
}/auth/meRetorna os dados do usuário autenticado e, se houver, da empresa vinculada.
Sem corpo de requisição.
{
"status": "success",
"data": {
"usuario": { "id": "uuid", "nome": "string", "email": "string", "cargo": "string", "ativo": true, "foto_url": "string | null" },
"empresa": { "id": "uuid", "nome": "string", "nome_fantasia": "string", "razao_social": "string", "cnpj": "string" } | null
}
}/auth/sessoesLista o histórico recente de logins (sessões) do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"data": [
{ "id": "uuid", "device": "Chrome · Windows", "location": "string | 'Desconhecida'", "time": "string (data)", "status": "ok" }
]
}/auth/sessoes/desconectar-todasInvalida globalmente (Supabase Auth signOut escopo 'global') todos os tokens do usuário, derrubando todas as sessões ativas em qualquer dispositivo.
Sem corpo de requisição.
{
"status": "success",
"message": "Todos os dispositivos foram desconectados."
}/auth/usuariosLista os usuários da empresa do usuário autenticado, exceto o próprio usuário que faz a chamada.
Sem corpo de requisição.
{
"status": "success",
"data": [
{ "id": "uuid", "nome": "string", "email": "string", "cargo": "string", "ativo": true, "foto_url": "string | null" }
]
}/auth/usuarios/:idAtualiza dados de um usuário (nome, cargo, ativo, foto_url), sempre revinculando-o à empresa do usuário autenticado.
{
"nome": "Maria Caixa",
"ativo": false
}{
"status": "success",
"data": { "id": "uuid", "nome": "string", "email": "string", "cargo": "string", "ativo": true }
}/auth/usuarios/:idRemove um usuário. Se a query excluirContas=true for enviada, remove também as contas a pagar geradas para ele (ex.: salários).
Sem corpo de requisição.
{
"status": "success",
"message": "Usuário removido com sucesso"
}CRUD de empresas. Todas as rotas exigem JWT. O acesso é restrito à própria empresa do usuário autenticado: empresaId é sempre derivado do token (nunca de parâmetros da requisição).
/empresasCria a empresa e gera automaticamente um plano de contas padrão com 15 contas (Ativo, Passivo, PL, Receita, Despesa).
{
"nome": "Acme Corp",
"nome_fantasia": "Acme",
"razao_social": "Acme Corp Finance Ltda",
"cnpj": "12345678000199"
}{
"status": "success",
"message": "Empresa criada com plano de contas padrao.",
"data": {
"empresa": { "id": "uuid", "nome": "string", "nome_fantasia": "string", "razao_social": "string", "cnpj": "string" },
"plano_contas_padrao": [
{ "id": "uuid", "empresa_id": "uuid", "codigo": "1.1.01", "nome": "Caixa", "tipo": "ATIVO" }
]
}
}Atenção
/empresasRetorna, em formato de lista, apenas a empresa vinculada ao usuário autenticado (req.usuario.empresaId, derivado do token).
Sem corpo de requisição.
{
"status": "success",
"data": [
{ "id": "uuid", "nome": "string", "nome_fantasia": "string", "razao_social": "string", "cnpj": "string" }
]
}/empresas/:idBusca uma empresa por ID. Só é permitido buscar a própria empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"data": { "id": "uuid", "nome": "string", "nome_fantasia": "string", "razao_social": "string", "cnpj": "string" }
}/empresas/:idAtualiza dados cadastrais da própria empresa. Aceita atualização parcial (ao menos um campo).
{
"nome_fantasia": "Acme 2.0"
}{
"status": "success",
"data": { "id": "uuid", "nome": "string", "nome_fantasia": "string", "razao_social": "string", "cnpj": "string" }
}/empresas/:idRemove a própria empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"message": "Empresa removida com sucesso.",
"data": { "id": "uuid", "nome": "string", "nome_fantasia": "string", "razao_social": "string", "cnpj": "string" }
}Cadastro completo (RH) dos funcionários da empresa do usuário autenticado, incluindo dados salariais, configuração de folha e fechamento mensal de folha de pagamento.
/funcionariosCria o cadastro de RH de um funcionário (salário, dia de pagamento, configuração de descontos/benefícios da folha). Distinto de POST /auth/registrar-usuario, que cria as credenciais de login.
{
"nome": "Maria Caixa",
"email": "maria@acmecorp.com",
"cargo": "CAIXA",
"cpf_cnpj": "12345678900",
"salario": 2500.0,
"data_admissao": "2026-01-10"
}{
"status": "success",
"data": {
"id": "uuid", "empresa_id": "uuid", "nome": "string", "cargo": "string", "email": "string",
"cpf_cnpj": "string", "salario": 2500.0, "dia_pagamento": 5, "data_admissao": "string",
"config_folha": "object | undefined", "foto_url": "string | undefined"
}
}/funcionariosLista os funcionários da empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"data": [
{
"id": "uuid", "nome": "string", "email": "string",
"empresa_id": "uuid", "cargo": "GERENTE | CAIXA | DONO",
"cpf": "string | undefined", "data_nascimento": "string | undefined",
"foto_url": "string | undefined"
}
]
}/funcionarios/folha/fecharFecha a folha de pagamento do mês/ano informado: gera holerites e as respectivas contas a pagar (salário líquido, FGTS, INSS) para todos os funcionários elegíveis da empresa. Idempotente por funcionário/mês/ano — pula quem já tem holerite gerado.
{
"mes": 6,
"ano": 2026
}{
"status": "success",
"data": { "success": true, "count": 3, "message": "Folha fechada com sucesso. 3 holerites gerados." }
}Atenção
/funcionarios/folha/holeritesLista os holerites gerados para a empresa em um mês/ano específico.
Sem corpo de requisição.
{
"status": "success",
"data": [
{ "id": "uuid", "empresa_id": "uuid", "funcionario_id": "uuid", "mes_referencia": 6, "ano_referencia": 2026, "salario_bruto": 2500.0, "total_descontos": 300.0, "total_acrescimos": 0, "salario_liquido": 2200.0, "detalhes": "object" }
]
}/funcionarios/:idBusca um funcionário por ID, restrito à empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"data": { "id": "uuid", "empresa_id": "uuid", "nome": "string", "cargo": "string", "email": "string", "cpf_cnpj": "string", "salario": 2500.0, "dia_pagamento": 5, "data_admissao": "string" }
}/funcionarios/:idAtualiza o cadastro de RH do funcionário. Aceita atualização parcial.
{
"salario": 2700.0
}{
"status": "success",
"data": { "id": "uuid", "empresa_id": "uuid", "nome": "string", "cargo": "string", "salario": 2700.0 }
}/funcionarios/:idRemove o cadastro de RH do funcionário. Opcionalmente exclui também as contas a pagar de salário associadas.
Sem corpo de requisição.
{
"status": "success",
"message": "Funcionário removido com sucesso.",
"data": { "id": "uuid", "nome": "string" }
}CRUD do plano de contas contábil (Ativo, Passivo, PL, Receita, Despesa, Custo) usado nos lançamentos e relatórios.
/plano-contasCria uma nova conta contábil na empresa do usuário autenticado.
{
"codigo": "1.1.02",
"nome": "Bancos",
"tipo": "ATIVO"
}{
"status": "success",
"message": "Conta contabil criada com sucesso.",
"data": { "id": "uuid", "empresa_id": "uuid", "codigo": "string", "nome": "string", "tipo": "ATIVO" }
}/plano-contasLista as contas contábeis da empresa do usuário autenticado. Não é possível listar contas de outras empresas.
Sem corpo de requisição.
{
"status": "success",
"data": [ { "id": "uuid", "empresa_id": "uuid", "codigo": "string", "nome": "string", "tipo": "ATIVO" } ]
}/plano-contas/:idBusca uma conta contábil por ID, restrita à empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"data": { "id": "uuid", "empresa_id": "uuid", "codigo": "string", "nome": "string", "tipo": "ATIVO" }
}/plano-contas/:idAtualiza uma conta contábil. Aceita atualização parcial (ao menos um campo).
{
"nome": "Bancos Conta Movimento"
}{
"status": "success",
"data": { "id": "uuid", "empresa_id": "uuid", "codigo": "string", "nome": "string", "tipo": "ATIVO" }
}/plano-contas/:idRemove uma conta contábil da empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"message": "Conta contabil removida com sucesso.",
"data": { "id": "uuid", "empresa_id": "uuid", "codigo": "string", "nome": "string", "tipo": "ATIVO" }
}Registro de lançamentos em partida dobrada.
/lancamentos/lancamentoCria um lançamento contábil completo de partida dobrada, com múltiplas partidas de débito/crédito.
{
"empresa_id": "uuid",
"data_lancamento": "2026-06-23",
"descricao": "Pagamento de aluguel",
"tipoTransacao": "DEBITO",
"partidas": [
{ "conta_id": "uuid-conta-despesa", "tipo": "D", "valor": 800.0 },
{ "conta_id": "uuid-conta-caixa", "tipo": "C", "valor": 800.0 }
]
}{
"message": "Lançamento criado com sucesso!",
"dados": { "...": "eco do payload validado enviado no body" }
}/lancamentos/lancamentosLista todos os lançamentos (com suas partidas) da empresa do usuário autenticado.
Sem corpo de requisição.
[
{
"id": "uuid",
"empresaId": "uuid",
"dataLancamento": "2026-06-01T00:00:00.000Z",
"descricao": "string",
"partidas": [ { "contaId": "uuid", "tipo": "D", "valor": 100.0 } ]
}
]/lancamentos/lancamento/simplificadoCria um lançamento simplificado de receita ou despesa (o backend monta as partidas D/C automaticamente usando as contas padrão Caixa/Receita/Despesa da empresa, sem exigir conta_id do cliente).
{
"descricao": "Venda balcão",
"valor": 250.0,
"tipoTransacao": "CREDITO",
"data_lancamento": "2026-06-23"
}{
"message": "Lançamento simplificado criado com sucesso!",
"dados": { "...": "eco do payload validado enviado no body" }
}Controle de valores a receber, sempre escopado à empresa do usuário autenticado.
/contas-receberCria uma conta a receber (nasce sempre como 'recebido: false').
{
"origem": "Cliente XPTO",
"valor": 500.0,
"tipo": "VENDA",
"data_previsao": "2026-07-01"
}{
"id": "uuid", "empresa_id": "uuid", "origem": "string", "valor": 500.0, "tipo": "string", "data_previsao": "2026-07-01", "recebido": false, "data_recebimento": null
}/contas-receberLista as contas a receber da empresa.
Sem corpo de requisição.
{
"status": "success",
"data": [
{ "id": "uuid", "empresa_id": "uuid", "origem": "string", "valor": 500.0, "data_previsao": "2026-07-01", "recebido": false }
]
}/contas-receber/:idRecebe/baixa a conta: marca como recebida e gera automaticamente o lançamento contábil de partida dobrada correspondente.
{
"valor_pago": 500.0
}{
"message": "Conta recebida e lançamento contábil gerado com sucesso!",
"dados": { "...": "conta a receber atualizada" }
}/contas-receber/:idAtualiza dados de uma conta a receber ainda não recebida. Não é possível editar uma conta já recebida.
{
"valor": 550.0
}{
"id": "uuid", "empresa_id": "uuid", "origem": "string", "valor": 550.0, "recebido": false
}Controle de valores a pagar, sempre escopado à empresa do usuário autenticado. Estrutura análoga a Contas a Receber.
/contas-pagarCria uma conta a pagar (nasce sempre como 'pago: false').
{
"descricao": "Aluguel escritório",
"valor": 800.0,
"tipo": "DESPESA_FIXA",
"data_vencimento": "2026-07-05"
}{
"id": "uuid", "empresa_id": "uuid", "descricao": "string", "valor": 800.0, "tipo": "string", "data_vencimento": "2026-07-05", "pago": false, "data_pagamento": null
}/contas-pagarLista as contas a pagar da empresa.
Sem corpo de requisição.
[
{ "id": "uuid", "empresa_id": "uuid", "descricao": "string", "valor": 800.0, "data_vencimento": "2026-07-05", "pago": false }
]/contas-pagar/:id/pagarPaga/baixa a conta: marca como paga e gera automaticamente o lançamento contábil de partida dobrada correspondente.
{
"valor_pago": 800.0
}{
"message": "Conta paga e lançamento contábil gerado!",
"dados": { "...": "conta a pagar atualizada" }
}/contas-pagar/:idAtualiza dados de uma conta a pagar ainda não paga. Não é possível editar uma conta já paga.
{
"valor": 850.0
}{
"id": "uuid", "empresa_id": "uuid", "descricao": "string", "valor": 850.0, "pago": false
}Relatórios contábeis gerados a partir dos lançamentos e plano de contas: DRE e Balanço Patrimonial.
/relatorios/dreGera a Demonstração do Resultado do Exercício (DRE): receitas e despesas agregadas por conta dentro de um período.
Sem corpo de requisição.
{
"status": "success",
"data": {
"empresaId": "uuid",
"dataInicio": "2026-06-01T00:00:00.000Z",
"dataFim": "2026-06-23T00:00:00.000Z",
"receitas": [ { "codigo": "4.1.01", "nome": "Vendas", "saldo": 1500.0 } ],
"despesas": [ { "codigo": "5.1.01", "nome": "Aluguel", "saldo": 800.0 } ],
"totalReceitas": 1500.0,
"totalDespesas": 800.0,
"resultadoLiquido": 700.0
}
}/relatorios/balanco-patrimonialGera o Balanço Patrimonial na data base informada: saldos de Ativo, Passivo e Patrimônio Líquido (incluindo o Lucro/Prejuízo Acumulado do período), com auditoria de que Ativo = Passivo + PL.
Sem corpo de requisição.
{
"status": "success",
"data": {
"empresaId": "uuid",
"dataBase": "2026-06-23T23:59:59.999Z",
"ativos": [ { "codigo": "1.1.01", "nome": "Caixa", "saldo": 3000.0 } ],
"passivos": [ { "codigo": "2.1.01", "nome": "Fornecedores", "saldo": 500.0 } ],
"patrimonioLiquido": [ { "codigo": "3.9.99", "nome": "Lucro/Prejuízo Acumulado", "saldo": 700.0 } ],
"totalAtivo": 3000.0,
"totalPassivo": 500.0,
"totalPL": 700.0,
"equacaoValida": false
}
}Atenção
Indicadores agregados para a tela inicial do sistema: resumo financeiro, desempenho mensal, categorias de receita, movimentações recentes, pendências e fluxo de caixa.
/dashboard/resumoRetorna um panorama consolidado da empresa no período: resumo financeiro, desempenho mensal anual, receita por categoria, movimentações recentes (últimas 10) e pendências operacionais.
Sem corpo de requisição.
{
"status": "success",
"data": {
"resumo": "IResumoDashboard",
"desempenhoAnual": "IDesempenhoMensal[]",
"receitaPorCategoria": "IReceitaCategoria[]",
"movimentacoesRecentes": "IMovimentacaoRecente[]",
"pendenciasOperacionais": "IPendenciaOperacional[]"
}
}/dashboard/fluxo-caixaRetorna a série de fluxo de caixa (entradas/saídas) da empresa no período.
Sem corpo de requisição.
{
"status": "success",
"data": [ { "data": "2026-06-01", "entradas": 1500.0, "saidas": 800.0 } ]
}Anexo e consulta de notas fiscais/comprovantes vinculados a uma conta a pagar ou a receber, sempre escopados à empresa do usuário autenticado.
/notas-fiscaisAnexa uma nota fiscal a uma conta a pagar ou a receber. Rejeita nome de arquivo ou número de nota duplicados na mesma empresa.
{
"tipo_referencia": "conta_pagar",
"referencia_id": "uuid",
"arquivo_url": "https://.../nota.pdf",
"arquivo_nome": "nota-123.pdf",
"numero_nota": "123"
}{
"id": "uuid", "empresa_id": "uuid", "tipo_referencia": "conta_pagar", "referencia_id": "uuid",
"numero_nota": "string | null", "arquivo_url": "string", "arquivo_nome": "string", "emitida_em": "string | null"
}/notas-fiscaisLista todas as notas fiscais da empresa do usuário autenticado.
Sem corpo de requisição.
[
{ "id": "uuid", "empresa_id": "uuid", "tipo_referencia": "conta_pagar", "referencia_id": "uuid", "arquivo_url": "string", "arquivo_nome": "string" }
]/notas-fiscais/referencia/:referencia_idLista as notas fiscais anexadas a uma conta a pagar/receber específica.
Sem corpo de requisição.
[
{ "id": "uuid", "empresa_id": "uuid", "tipo_referencia": "conta_receber", "referencia_id": "uuid", "arquivo_url": "string", "arquivo_nome": "string" }
]/notas-fiscais/:idRemove uma nota fiscal da empresa do usuário autenticado.
Sem corpo de requisição.
(corpo vazio)Cadastro de cargos personalizados usados pela empresa (distintos do cargo de sistema DONO/CAIXA/GERENTE do usuário).
/cargosCria um novo cargo para a empresa do usuário autenticado.
{
"nome": "Supervisor de Caixa",
"descricao": "Responsável por conferir fechamentos de caixa"
}{
"status": "success",
"data": { "id": "uuid", "empresa_id": "uuid", "nome": "string", "descricao": "string | undefined" }
}/cargosLista os cargos cadastrados na empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"data": [ { "id": "uuid", "empresa_id": "uuid", "nome": "string", "descricao": "string | undefined" } ]
}/cargos/:idAtualiza nome e/ou descrição de um cargo da empresa.
{
"nome": "Supervisor Sênior"
}{
"status": "success",
"data": { "id": "uuid", "empresa_id": "uuid", "nome": "string", "descricao": "string | undefined" }
}/cargos/:idRemove um cargo da empresa do usuário autenticado.
Sem corpo de requisição.
{
"status": "success",
"message": "Cargo deletado com sucesso."
}Notificações internas do sistema para a empresa do usuário autenticado.
/notificacoesLista as notificações da empresa e a contagem de não lidas.
Sem corpo de requisição.
{
"notificacoes": [
{ "id": "uuid", "titulo": "string", "mensagem": "string", "lida": false, "data_criacao": "string" }
],
"naoLidas": 3
}/notificacoes/:id/lidaMarca uma notificação da empresa como lida.
Sem corpo de requisição.
{
"id": "uuid",
"titulo": "string",
"lida": true
}