Pular para o conteúdo principal

Catálogo completo de endpoints

Inventário gerado a partir dos controllers em src/ (NestJS 11). Prefixo global: api. Versionamento URI: v1 salvo rotas VERSION_NEUTRAL.

Base local: http://localhost:3000
Swagger: /api/docs · JSON /api/docs-json · YAML /api/docs-yaml
Auth padrão: Authorization: Bearer <JWT> · opcional x-tenant-id (UUID)

Legenda Auth: Pública = @Public() (sem Bearer). Bearer = JWT obrigatório. Admin = role: admin (cross-tenant).


1. Meta, saúde e OpenAPI

MétodoPathAuthControllerSucessoNotas
GET/apiPúblicaAppController200{ name, version, docs, swagger }docs aponta para /api/health
GET/api/healthPúblicaHealthController200{ status: "ok", timestamp } (liveness; não faz ping à BD)
GET/api/docsPúblicaSwaggerModule200UI OpenAPI
GET/api/docs-jsonPúblicaSwaggerModule200OpenAPI JSON
GET/api/docs-yamlPúblicaSwaggerModule200OpenAPI YAML

Detalhe: 01-health-meta.md.


2. Auth — /api/v1/auth

Controller: AuthV1Controller · BD: USER_PROFILES (public."user").

MétodoPathAuthSucessoDescrição
POST/api/v1/auth/loginPública200Email/senha → { accessToken, tokenType, expiresIn, user }. Body: email, password, opcional tenantId/tid
POST/api/v1/auth/logoutBearer200Decrementa metadata.sessoesAtivas. { success, sessoesAtivas }
POST/api/v1/auth/registerPública201Cria utilizador + tabelas relacionais. 409 se email/username duplicado
GET/api/v1/auth/users/:userIdBearer200Perfil completo. Qualquer JWT válido
PATCH/api/v1/auth/users/:userIdBearer200Patch parcial; arrays substituem. Próprio ou admin. 403/409
PATCH/api/v1/auth/users/:userId/permissionsBearer200grant/revoke por permissao_id ou chave

Erros típicos: 400 validação, 401 JWT/credenciais, 403 conta inativa ou sem permissão, 404 utilizador.

Detalhe: 02-auth.md.


3. Password reset — /api/v1/auth/password-reset

Controller: PasswordResetV1Controller · todas públicas.

MétodoPathSucessoDescrição
POST/api/v1/auth/password-reset/request200Código 6 dígitos (~15 min), e-mail SMTP, token AES-256-GCM em {{link}}
GET/api/v1/auth/password-reset/token?token=200Decifra token → email, codigo, expiraEm. 400 inválido/expirado
POST/api/v1/auth/password-reset/confirm204Body: token ou email+codigo + nova senha

4. First access — /api/v1/auth/first-access

Controller: FirstAccessV1Controller · todas públicas.

MétodoPathSucessoDescrição
GET/api/v1/auth/first-access/token?token=200Token do link /primeiro-acesso?token=
POST/api/v1/auth/first-access/confirm204Tipo welcome_first_access em logs_password_resets

Detalhe: 03-password-reset-first-access.md.


5. CRM admin users — /api/v1/crm-admin/users

Controller: UserProfilesV1Controller.

MétodoPathAuthSucessoDescrição
GET/api/v1/crm-admin/usersBearer200Lista todos os public."user" (resumo UserProfileResponseDto)

Detalhe: 04-crm-admin-users.md.


6. Empresas globais — /api/v1/companies

Controller: CompaniesV1Controller · BD default.

MétodoPathAuthSucessoDescrição
POST/api/v1/companiesBearer201Cria empresa. Tenant: JWT, body tenantId ou x-tenant-id. 409 CNPJ
GET/api/v1/companiesBearer200Listagem global paginada. Query: pageNumber (default 1), pageSize (default 20, máx 100)

Detalhe: 05-companies.md.


7. Diretório por tenant — /api/v1/company/directory

Controller: CompanyDirectoryV1Controller. Admin sem tenant lista todas.

MétodoPathAuthSucessoDescrição
POST/api/v1/company/directoryBearer + tenant201Criar no contexto do tenant
GET/api/v1/company/directoryBearer200Lista paginada (pageNumber, pageSize). Admin sem tenant = global
GET/api/v1/company/directory/:companyIdBearer200Detalhe + sync de roles/contacts
PATCH/api/v1/company/directory/:idBearer200Atualização parcial (dados gerais / metadata)
PUT/api/v1/company/directory/:companyId/brandingBearer200Upsert branding
POST/api/v1/company/directory/:companyId/addressesBearer201Adicionar morada
PATCH/api/v1/company/directory/:companyId/addresses/:addressIdBearer200Atualizar morada
DELETE/api/v1/company/directory/:companyId/addresses/:addressIdBearer204Remover morada
POST/api/v1/company/directory/:companyId/documentsBearer201Adicionar documento
DELETE/api/v1/company/directory/:companyId/documents/:documentIdBearer204Remover documento

Detalhe: 06-company-directory.md.


8. Utilizadores por empresa — /api/v1/company

Controller: CompanyUsersV1Controller. tenetid é alias histórico de tenentid.

MétodoPathAuthSucessoDescrição
GET/api/v1/company/:companyId/tenetid/:tenantIdBearer200Alias typo — sub-empresas
GET/api/v1/company/:companyId/tenentid/:tenantIdBearer200Sub-empresas ligadas à empresa
GET/api/v1/company/:companyId/tenentid/:tenantId/userBearer200Utilizadores das sub-empresas
GET/api/v1/company/:companyId/user/with-subcompaniesBearer200Contagem empresa + filhas
GET/api/v1/company/:companyId/userBearer200Contagem de users da empresa

Detalhe: 07-company-users.md.


9. Operacional — /api/v1/company/directory/:companyId/operational

Controller: CompanyOperationalV1Controller. JWT + tenant (admin pode omitir tenant). 404 se company fora do tenant.

Query de período (dashboard, top, comissões): dataInicio, dataFim (ISO / YYYY-MM-DD). Default: ~30 dias até agora. Top: limite 1–100 (default 10).

MétodoPath relativo ao prefixo operacionalSucessoDescrição
GET/estabelecimentos200ECs cujo representante pertence à company
GET/estabelecimentos/:estabelecimentoId200Detalhe + valoresDeclarados
GET/dashboard200TPV transacoes_locais status APPR
GET/top-estabelecimentos200Ranking por volume bruto APPR
GET/comissoes/resumo200Bruto / líquido / spread por EC
GET/alugueis/resumo200entrepay_dispositivos.status = ATIVO
GET/propostas200propostas.company_id ou ECs acessíveis

Exemplo: GET /api/v1/company/directory/{companyId}/operational/dashboard?dataInicio=2026-04-01&dataFim=2026-05-04

Detalhe: 08-company-operational.md.


10. Presença REST — /api/v1/presence

Controller: PresenceV1Controller. Estado em memória — restart limpa sessões.

MétodoPathAuthSucessoDescrição
GET/api/v1/presence/active-usersBearer + tenant200Sessões no tenant. 400 sem tenantId/x-tenant-id
GET/api/v1/presence/active-users-globalBearer admin200Todas as sessões. 403 se não admin
GET/api/v1/presence/online-count/main-companiesBearer200Empresas mãe. Query opcional parentCompanyId
GET/api/v1/presence/online-count/sub-companiesBearer200Sub-empresas. Query opcional parentCompanyId
GET/api/v1/presence/online-count/aggregated-by-parentBearer200Query obrigatória parentCompanyId (UUID v4)

WebSocket — namespace /presence

ItemValor
Path Socket.IO/socket.io
Handshake{ token: "<JWT>" } (mesmo segredo que a API)
Salastenant:<tenantId>, admin:observer (admins não contam como online)
Eventos (ex.)presence:sync, presence:join, presence:leave, presence:error, cliente presence:status

Detalhe: 09-presence.md.


11. White label — /api/v1/white-labels

Controller: WhiteLabelsV1Controller.

MétodoPathAuthSucessoDescrição
GET/api/v1/white-labels/:tenantIdBearer200Paginado (pageNumber, pageSize). Não-admin só o próprio tenant. Admin: qualquer

Detalhe: 10-white-label.md.


12. APIs externas (proxies autenticados)

Todas exigem Bearer. Upstream público.

MétodoPath CentralCRMUpstream
GET/api/v1/external-apis/opencnpj/:cnpjhttps://api.opencnpj.org/{CNPJ} (só dígitos)
GET/api/v1/external-apis/cep/v1/:cephttps://brasilapi.com.br/api/cep/v1/{cep}
GET/api/v1/external-apis/cep/v2/:cephttps://brasilapi.com.br/api/cep/v2/{cep} (geo quando disponível)
GET/api/v1/external-apis/banks/v1https://brasilapi.com.br/api/banks/v1

Detalhe: 11-external-apis.md.


13. Portal / subdomínio

MétodoPathAuthControllerSucessoDescrição
GET/api/v1/portal/subdomain-url?portalTenantId=Pública (sem JWT)PortalUrlController200URL {slug}.{PORTAL_BASE_DOMAIN}. 404 inativo/inexistente
GET/api/v1/portal/internal/check-hostPúblicaPortalTlsCheckController200Check interno TLS (Caddy). Fora do Swagger
GET/api/tenants/id/:tenantId/iconBearerTenantBrandingMediaV1Controller200 / 204Binário ou ?json=true. 404 tenant inexistente

Detalhe: 12-portal-subdomain.md.


14. Templates de e-mail — /api/v1/email-templates

Controller: EmailTemplateV1Controller. Apenas admin.

MétodoPathAuthSucessoDescrição
GET/api/v1/email-templates/:templateKeyBearer admin200Chaves: lock_reset, waving_hand. 403/404
PATCH/api/v1/email-templates/:templateKeyBearer admin200Patch placeholders. 400 placeholder inválido

Detalhe: 13-email-templates.md.


15. Branding do utilizador — /api/centralbackend/users

Controller: UserBrandingMediaV1Controller · VERSION_NEUTRAL (sem /v1). PATCH de terceiros exige perm-user-edit. Query ?json=true devolve JSON.

MétodoPathAuthDescrição
GET/api/centralbackend/users/me/iconBearerÍcone do autenticado
PATCH/api/centralbackend/users/me/iconBearerAtualizar ícone
GET/api/centralbackend/users/me/bannerBearerBanner do autenticado
PATCH/api/centralbackend/users/me/bannerBearerAtualizar/remover banner
GET/api/centralbackend/users/id/:userUuid/iconBearerÍcone de outro
PATCH/api/centralbackend/users/id/:userUuid/iconBearerPATCH terceiro (perm-user-edit)
GET/api/centralbackend/users/id/:userUuid/bannerBearerBanner de outro
PATCH/api/centralbackend/users/id/:userUuid/bannerBearerPATCH terceiro (perm-user-edit)

Detalhe: 14-user-branding-media.md.


16. Roles — /api/centralbackend/roles

Controller: CentralbackendRolesController · VERSION_NEUTRAL.

MétodoPathAuthDescrição
GET/api/centralbackend/rolesBearerCatálogo public.roles
GET/api/centralbackend/roles/with-usersBearerRoles com utilizadores por role_number

17. Users legado — /api/users

Controller: UsersLegacyController · VERSION_NEUTRAL. Preferir /api/v1/auth/users/:userId.

MétodoPathAuthEquivalente
GET/api/users/:userIdBearerGET /api/v1/auth/users/:userId
PUT/api/users/:userIdBearerPATCH /api/v1/auth/users/:userId
PATCH/api/users/:userIdBearerPATCH /api/v1/auth/users/:userId

Detalhe: 15-roles-legacy.md.


18. Cadastro completo — /api/centralcrm/cadastrocompany

Controller: CentralcrmCadastroCompanyController · VERSION_NEUTRAL.

MétodoPathAuthSucessoDescrição
POST/api/centralcrm/cadastrocompanyBearer201Transação única (empresa + relacionados)

Detalhe: 16-cadastro-company.md.


Totais

SuperfícieQuantidade
HTTP REST (controllers da app)70 rotas (incluindo aliases tenetid/tenentid e legado PUT/PATCH users)
OpenAPI (docs / json / yaml)3
WebSocket1 namespace (/presence)

Rotas públicas (@Public): GET /api, GET /api/health, POST /api/v1/auth/login, POST /api/v1/auth/register, as 3 de password-reset, as 2 de first-access, GET /api/v1/portal/subdomain-url, GET /api/v1/portal/internal/check-host.

Formato de erro global:

{
"statusCode": 400,
"timestamp": "2026-09-16T12:00:00.000Z",
"path": "/api/v1/auth/login",
"message": "string ou string[]"
}