Referência de API
Base URL: http://localhost:3001
Níveis de auth:
- Pública — sem token
- Usuário — requer JWT válido (qualquer nível)
- Admin — requer JWT com
nivel = "3"
Formato de resposta: os domínios Auth e Usuários envolvem a resposta em um wrapper { status, msg, ... }. Os demais retornam o objeto direto (ex: { items }, { ok: true }).
Health
| Método |
Rota |
Auth |
Descrição |
| GET |
/health |
Pública |
Status dos serviços (API, banco, Qdrant, Ollama) |
Resposta:
{ "ok": true, "checks": { "api": true, "db": true, "qdrant": true, "ollama": true } }
Auth (/api/auth)
| Método |
Rota |
Auth |
Body |
Retorno |
| POST |
/api/auth/login |
Pública |
{ login, senha } |
200 { status, msg, usuario, accessToken?, refreshToken? } |
| POST |
/api/auth/logout |
Pública |
{ refreshToken } |
200 { status, msg } |
| POST |
/api/auth/refresh |
Pública |
{ refreshToken } |
200 { status, accessToken } |
login aceita e-mail ou login; os campos também são aceitos em PascalCase (Login/Senha).
accessToken/refreshToken só são emitidos quando JWT_SECRET está configurado.
- O login pode retornar
429 após 5 tentativas incorretas (bloqueio de 15 minutos).
Chat (/api/chat)
| Método |
Rota |
Auth |
Body |
Retorno |
| POST |
/api/chat |
Usuário |
{ message, conversationId?, sessionId?, model?, options? } |
{ answer, sources } |
| POST |
/api/chat/stream |
Usuário |
{ message, conversationId? } |
Stream SSE |
- O campo de texto é
message (não content).
options aceita { temperature?, top_p? }.
- Stream SSE: cada linha tem o formato
data: { "type": "delta" | "sources" | "error", ... }, terminada por data: [DONE].
Conversas (/api/conversations)
| Método |
Rota |
Auth |
Body / Params |
Retorno |
| GET |
/api/conversations |
Usuário |
?limit&offset |
{ items } |
| POST |
/api/conversations |
Usuário |
{ title? } |
{ id, title } |
| GET |
/api/conversations/:id/messages |
Usuário |
— |
{ items } ou 404 { error: "not_found" } |
| PATCH |
/api/conversations/:id |
Usuário |
{ title } |
{ ok: true } |
| DELETE |
/api/conversations/:id |
Usuário |
— |
200 { ok: true } |
| GET |
/api/conversations/:id/export |
Usuário |
— |
{ markdown } ou 404 |
- Cada item de
GET /api/conversations traz Id, Title, CreatedAt, UpdatedAt, MessageCount.
Documentos (/api/documents)
| Método |
Rota |
Auth |
Body / Params |
Retorno |
| GET |
/api/documents |
Usuário |
?limit&offset |
{ items, nextOffset } |
| DELETE |
/api/documents/source/:source |
Admin |
— |
{ ok: true } |
Ingest (/api/ingest)
| Método |
Rota |
Auth |
Body |
Retorno |
| POST |
/api/ingest |
Admin |
{ documents: [{ text, source?, id?, metadata? }] } |
{ upserted } |
| POST |
/api/ingest/file |
Admin |
multipart/form-data com campo file (+ source?), máx 25 MB |
{ upserted, documents, extractedChars } |
| POST |
/api/ingest/url |
Admin |
{ url, source? } |
{ upserted, source, extractedChars } |
- Em
POST /api/ingest, o campo raiz é o array documents, e o texto de cada item é text.
- Em
POST /api/ingest/url, a url deve começar com https://.
- Formatos de arquivo suportados: TXT, PDF e DOCX (processados via Mammoth/pdf-parse).
Busca (/api/search)
| Método |
Rota |
Auth |
Body |
Retorno |
| POST |
/api/search |
Usuário |
{ query, topK? } |
{ results } |
Usuários (/api/users)
| Método |
Rota |
Auth |
Body |
Retorno |
| GET |
/api/users |
Admin |
— |
{ status, items } |
| POST |
/api/users |
Admin |
{ Nome, Login, Email, Senha, Nivel, Setor } |
201 { status, usuario } |
| PUT |
/api/users/:id |
Admin |
{ Nome?, Email?, Nivel?, Setor? } |
{ status, usuario } |
| PATCH |
/api/users/:id/status |
Admin |
— |
{ status, novoStatus } |
| PATCH |
/api/users/:id/senha |
Próprio ou Admin |
{ senhaAtual, senhaNova } |
200 { status, msg } |
- Campos de body em PascalCase. Em
POST, todos são obrigatórios; Nivel aceita "1", "2" ou "3".
PUT atualiza parcialmente e não aceita alterar Login. Exige ao menos um campo.
PATCH /:id/senha pode ser chamado pelo próprio usuário ou por um admin. Pode retornar 409 (login já cadastrado) no POST.
Erros comuns
| Status |
Significado |
400 |
Body/params inválidos (falha de validação zod) |
401 |
Token ausente, inválido ou expirado; credenciais incorretas |
403 |
Autenticado, mas sem permissão (nível insuficiente) |
404 |
Recurso não encontrado |
409 |
Conflito (ex: login já cadastrado) |
429 |
Excesso de requisições / login bloqueado por tentativas |
500 |
Erro interno do servidor |