Api Contracts Backend

Backend (BFF) HTTP API contracts: auth, chat, files, analytics, and admin endpoints with request/response schemas.

For integrators. The backend (BFF) HTTP API contracts — request/response shapes for auth, chat, files, analytics, and admin endpoints.

Component: components/gov-chat-backend/ (Node.js/Express) Base URL: https://<domain>/api (via Kong Gateway) Documentation: Swagger/OpenAPI available at /api-docs

Authentication

All endpoints (except where noted) require Keycloak JWT authentication via Authorization: Bearer <token> header.

Auth middleware: keycloakAuthMiddleware.authenticate (Keycloak OIDC) Admin endpoints: Additional keycloakAuthMiddleware.requireAdmin middleware


Route Domains

1. Authentication Routes (/api/auth)

Route File: routes/auth-routes.js Auth Required: None (login/logout endpoints) Base Paths: /api/auth

MethodPathAuth RequiredDescriptionNotes
POST/logoutYesLogout userInvalidates Keycloak session

2. User Profile Routes (/api/me)

Route File: routes/user-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/me

MethodPathAuth RequiredDescriptionNotes
GET/YesGet user profileReturns singleton user profile
GET/contextYesGet user contextUser preferences, settings
POST/reset-dataYesReset user dataClears user conversations/data
POST/deleteYesDelete user accountSoft/hard delete user account
PUT/YesUpdate user profileSupports file upload (avatar)

3. Query Routes (/api/queries, /api/query)

Route File: routes/query-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/queries, /api/query Special: SSE support on /stream endpoint

MethodPathAuth RequiredDescriptionNotes
POST/streamYesStream query response (SSE)text/event-stream, requires SSE enabled (default; OPEA_STREAMING≠false)
POST/YesCreate new queryStandard non-streaming query
GET/YesList queriesPaginated query list
GET/:queryIdYesGet query by IDFull query details
PATCH/:queryId/responsetimeYesUpdate query response timeInternal metrics
POST/:queryId/feedbackYesSubmit feedbackUser feedback on query result
PATCH/:queryId/answeredYesMark query as answeredStatus update
GET/:queryId/conversationsYesGet conversations for queryLink queries ↔ conversations
POST/:queryId/conversationYesCreate conversation for queryAuto-link query to conversation
POST/:queryId/link/:messageIdYesLink query to messageExplicit query-message linkage

SSE Event Types (/stream endpoint):

  • chunk - LLM response content
  • metadata - Query metadata (queryId, responseTime, etc.)
  • translation - Translated content (if enabled)
  • error - Error message with code
  • done - Stream completion

4. Chat History Routes (/api/chat, /api/chat-history)

Route File: routes/chat-history-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/chat, /api/chat-history

MethodPathAuth RequiredDescriptionNotes
GET/conversationsYesList user conversationsPaginated, filterable
GET/conversations/:conversationIdYesGet conversation detailsFull conversation with messages
POST/conversationsYesCreate new conversationInitialize conversation
PATCH/conversations/:conversationIdYesUpdate conversationTitle, metadata
DELETE/conversations/:conversationIdYesDelete conversationSoft delete
GET/conversations/:conversationId/messagesYesGet conversation messagesPaginated message list
POST/conversations/:conversationId/messagesYesAdd message to conversationCreate message
POST/conversations/:conversationId/messages/readYesMark messages as readRead receipt
GET/query/:queryId/messagesYesGet messages for queryReverse lookup
GET/messages/:messageId/queryYesGet query for messageReverse lookup
POST/query/:queryId/conversationYesCreate conversation from queryAuto-link
GET/searchYesSearch conversationsFull-text search
GET/recentYesGet recent conversationsQuick access
GET/statsYesGet conversation statisticsUser stats
GET/foldersYesList foldersUser folders
POST/foldersYesCreate folderNew folder
GET/folders/:folderIdYesGet folder detailsFolder metadata
PATCH/folders/:folderIdYesUpdate folderRename, metadata
DELETE/folders/:folderIdYesDelete folderCascade delete contents
GET/folders/searchYesSearch foldersFolder search
POST/folders/reorderYesReorder foldersCustom sort order
GET/folders/:folderId/pathYesGet folder pathBreadcrumb trail
POST/folders/:folderId/conversations/:conversationIdYesAdd conversation to folderFolder membership
DELETE/folders/:folderId/conversations/:conversationIdYesRemove conversation from folderFolder membership
GET/conversations/:conversationId/folderYesGet conversation folderFolder lookup
POST/conversations/:conversationId/moveYesMove conversation to folderChange folder

5. Analytics Routes (/api/analytics)

Route File: routes/analytics-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/analytics

MethodPathAuth RequiredDescriptionNotes
GET/dashboardYesGet analytics dashboardAggregate metrics
GET/metric/:metricYesGet specific metricGeneric metric lookup
GET/YesGet analytics overviewHigh-level stats
GET/timeseries/:metricTypeYesGet timeseries dataTime-based metrics
POST/eventsYesRecord analytics eventEvent tracking
GET/recordsYesGet analytics recordsRaw event records
GET/eventsYesGet eventsFiltered event list
GET/satisfaction/gaugeYesGet satisfaction gaugeUser satisfaction metric
GET/satisfaction/heatmapYesGet satisfaction heatmapSatisfaction by category

6. Admin Routes (/api/admin)

Route File: routes/admin-routes.js Auth Required: Yes + Admin Role (all endpoints) Base Paths: /api/admin Middleware: keycloakAuthMiddleware.authenticate + keycloakAuthMiddleware.requireAdmin

MethodPathAuth RequiredDescriptionNotes
GET/system-healthAdminGet system healthService status checks
GET/database/statsAdminGet database statisticsArangoDB stats
GET/logsAdminGet application logsLog retrieval
POST/logs/rolloverAdminTrigger log rolloverLog rotation
GET/user-statsAdminGet user statisticsUser metrics
GET/security-metricsAdminGet security metricsSecurity events
POST/security-scanAdminTrigger security scanSecurity audit
GET/security/last-scanAdminGet last security scanScan results
POST/diagnosticsAdminRun diagnosticsSystem diagnostics
GET/logs/summaryAdminGet logs summaryAggregated log stats
GET/logs/searchAdminSearch logsLog search
GET/logs/debug-yesterdayAdminGet yesterday’s debug logsDebug log retrieval
POST/database-operations/backupAdminTrigger database backupBackup operation
POST/database-operations/optimizeAdminOptimize databaseDB optimization
GET/users/searchAdminSearch usersUser lookup
GET/queries/inspectAdminList queries for inspectionQuery Inspector
GET/queries/inspect/:queryIdAdminInspect a specific queryQuery detail

7. Service Category Routes (/api/service-categories)

Route File: routes/service-category-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/service-categories

MethodPathAuth RequiredDescriptionNotes
GET/categoriesYesList service categoriesHierarchical categories
GET/categories/detailedYesGet detailed categoriesWith translations, services
GET/categories/:categoryIdYesGet category by IDCategory details
GET/:categoryId/translationsYesGet category translationsMultilingual translations
GET/services/:serviceId/translationsYesGet service translationsService translations
GET/searchYesSearch categoriesFull-text search
POST/YesCreate categoryNew category
DELETE/:categoryIdYesDelete categorySoft delete
DELETE/services/:serviceIdYesDelete serviceSoft delete
POST/initYesInitialize categoriesSeed categories
POST/:categoryId/servicesYesAdd service to categoryLink service
PUT/:categoryIdYesUpdate categoryCategory metadata
PUT/services/:serviceIdYesUpdate serviceService metadata

8. Service Routes (/api/services)

Route File: routes/service-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/services

MethodPathAuth RequiredDescriptionNotes
GET/categoriesYesList all servicesFlat service list
GET/categories/:categoryIdYesGet services by categoryCategory services
GET/searchYesSearch servicesFull-text search

9. Translation Routes (/api/translate)

Route File: routes/translation-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/translate

MethodPathAuth RequiredDescriptionNotes
POST/YesTranslate textText translation
POST/markdownYesTranslate markdownMarkdown-aware translation

10. Weather Routes (/api/weather)

Route File: routes/weather-routes.js Auth Required: Yes (all endpoints) Base Paths: /api/weather

MethodPathAuth RequiredDescriptionNotes
POST/YesGet weather dataWeather information

11. Logger Routes (/api/logger)

Route File: routes/logger-routes.js Auth Required: Yes + Admin Role (all endpoints) Base Paths: /api/logger Middleware: keycloakAuthMiddleware.authenticate + keycloakAuthMiddleware.requireAdmin

MethodPathAuth RequiredDescriptionNotes
POST/configureAdminConfigure loggerUpdate log levels
POST/rolloverAdminTrigger log rolloverLog rotation

12. Database Operations Routes (/api/database)

Route File: routes/database-operations-routes.js Auth Required: Yes (all endpoints, admin-level operations) Base Paths: /api/database

MethodPathAuth RequiredDescriptionNotes
POST/backupYesTrigger database backupBackup operation
POST/optimizeYesOptimize databaseDB optimization

Document Repository API

Component: components/document-repository/ (Node.js/Express) Base URL: https://<domain>/api (via Kong Gateway)

File Routes (/api/files)

Route File: src/routes/fileRoutes.js Auth Required: Mixed (Admin role for write operations) Base Paths: /api/files

MethodPathAuth RequiredDescriptionNotes
POST/uploadAdminUpload single filemultipart/form-data
POST/uploadsAdminUpload multiple filesBatch upload
POST/upload-linkAdminUpload file via linkURL-based upload
POST/crawl/scheduleAdminSchedule website crawlWeb crawling
GET/NoList all filesPaginated file list
GET/searchNoSearch metadataMetadata search
GET/search/filesNoSearch filesFull-text search
GET/:fileIdNoGet file metadataFile details
GET/:fileId/crawl-jobAdminGet crawl job statusCrawl status
GET/:fileId/crawl-metricsAdminGet crawl metricsCrawl analytics
GET/:fileId/crawl-logAdminGet crawl logsCrawl logs
POST/:fileId/kill-crawlAdminKill crawl taskStop crawl
POST/:fileId/kill-ingestAdminKill ingestion taskStop ingest
GET/:fileId/viewNoView fileFile preview
GET/:fileId/viewbrowserNoView file in browserBrowser preview
GET/:fileId/downloadNoDownload fileFile download
POST/downloadsNoDownload multiple filesBatch download
DELETE/:fileIdAdminDelete fileSoft delete
DELETE/AdminDelete multiple filesBatch delete
PATCH/:fileIdAdminUpdate file metadataFile metadata
POST/:fileId/ingestAdminIngest file to RAG pipelineStart ingestion
POST/:fileId/retractAdminRetract file from RAG pipelineRemove from vector store
POST/ingestAdminIngest multiple filesBatch ingestion
POST/retractAdminRetract multiple filesBatch retraction
POST/:fileId/ingestion-logAdminAdd ingestion log entryLog ingestion event
GET/:fileId/ingestion-logAdminGet ingestion logsIngestion history
PATCH/:fileId/statusAdmin, Dataprep ServiceUpdate file statusStatus update

Auth Middleware: authorizeRole(['Admin']) for write operations


Label Routes (/api/labels)

Route File: src/routes/labelRoutes.js Auth Required: Admin Role (all endpoints) Base Paths: /api/labels

MethodPathAuth RequiredDescriptionNotes
GET/AdminList all labelsHierarchical labels
GET/:labelIdAdminGet label by IDLabel details
POST/AdminCreate labelNew label
PATCH/:labelIdAdminUpdate labelLabel metadata
DELETE/:labelIdAdminDelete labelSoft delete
DELETE/:labelId/with-childrenAdminDelete label treeCascade delete
GET/:labelId/relatedAdminGet related labelsLabel relationships

Auth Middleware: authorizeRole(['Admin']) for all endpoints


Middleware Reference

Authentication Middleware

Keycloak OIDC Authentication (keycloakAuthMiddleware.authenticate)

  • Validates JWT tokens from Keycloak
  • Extracts user info from token
  • Applied at router level or per-route

Admin Role Check (keycloakAuthMiddleware.requireAdmin)

  • Requires realm_access.roles contains admin
  • Applied after authenticate middleware

Document Repository Auth

Role Authorization (authorizeRole(['Admin', 'dataprep-service']))

  • Checks Keycloak roles
  • Supports multiple roles (OR logic)
  • Some endpoints allow dataprep-service for internal calls

SSE Streaming Protocol

Endpoint: POST /api/queries/stream

Request Headers

Content-Type: application/json
Authorization: Bearer <token>

Response Headers

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

Event Format

data: {"type": "chunk", "content": "response text"}

data: {"type": "metadata", "queryId": "123", "responseTime": 1234}

data: {"type": "translation", "content": "translated text"}

data: {"type": "error", "message": "error message", "code": "ERROR_CODE"}

data: {"type": "done", "queryId": "123"}

: keepalive

Environment Control

  • Enabled by default — any value other than the literal string false enables it
  • Disable explicitly: OPEA_STREAMING=false (returns 501 error)

Error Response Format

All endpoints return JSON errors:

{
  "error": "ERROR_CODE",
  "message": "Human-readable error message",
  "details": {}
}

Common Error Codes

  • UNAUTHORIZED - Missing or invalid token
  • FORBIDDEN - Insufficient permissions
  • NOT_FOUND - Resource not found
  • VALIDATION_ERROR - Request validation failed
  • STREAMING_DISABLED - SSE streaming disabled (for /stream endpoint)
  • CHATQNA_STREAM_ERROR - Upstream OPEA service error
  • TRANSLATION_FAILED - Translation service error

Rate Limiting

Applied via Kong Gateway (configured in api-gateway-solution/):

  • Default: 100 requests per minute per IP
  • Authenticated users: Higher limits based on role
  • Admin users: No rate limiting

OpenAPI/Swagger Documentation

Interactive API documentation available at:

  • Development: http://localhost:3000/api-docs
  • Production: https://<domain>/api-docs

Note: Swagger definitions are inline in route files using JSDoc comments (@swagger, @summary, etc.)


CORS Configuration

Configured in Kong Gateway (api-gateway-solution/):

  • Allowed origins: CORS_ALLOWED_ORIGINS env var
  • Allowed methods: GET, POST, PUT, PATCH, DELETE, OPTIONS
  • Allowed headers: Authorization, Content-Type, X-Requested-With

Version History

  • v1.0 - Initial API design (2025)
  • v1.1 - Added folder management (2025)
  • v1.2 - Added SSE streaming (2025)
  • v1.3 - Added label routes (2025)
  • v1.4 - Refactored /api/me to singleton pattern (2025)