REST API
This page documents the active REST API surface in SMM.
Note: Swagger UI is the authoritative source for the full schema and examples. Default path:
http://localhost:<port>/api/docs.
Start API
From the workspace root:
smm dashboard serveDefault port is 3000 unless PORT is set.
Timezone query parameter
Time-based endpoints accept timezone as an optional IANA timezone identifier, for example Europe/Madrid, America/New_York, or UTC.
Use this parameter when sending date-only filters or when consuming grouped metrics from a dashboard or client application:
GET /pull-requests/summary?start_date=2026-01-01&end_date=2026-01-31&timezone=Europe%2FMadridREST requests use the timezone query parameter first. If it is missing or invalid, SMM falls back to the active project's configured timezone, then to UTC.
Date-only values such as 2026-01-01 are interpreted as calendar dates in the selected timezone. Offset-aware date-time values such as 2026-01-01T09:00:00+01:00 are treated as exact instants.
Pull Requests
GET /pull-requests/summaryGET /pull-requests/through-timeGET /pull-requests/by-authorGET /pull-requests/average-review-timeGET /pull-requests/average-open-byGET /pull-requests/average-commentsGET /pull-requests/comments-by-authorGET /pull-requests/first-comment-timeGET /pull-requests/filter-options
Common query params:
start_date,end_datetimezoneauthors,exclude_authors,exclude_commenters,labelsstatusaggregate_by
Pipelines
GET /pipelines/summaryGET /pipelines/by-statusGET /pipelines/jobs-by-statusGET /pipelines/runs-durationGET /pipelines/jobs-duration-by-workflowGET /dora/deployment-frequencyGET /pipelines/runs-byGET /pipelines/jobs-average-timeGET /pipelines/jobs-average-time-by-dayGET /pipelines/jobs-reruns-by-dayGET /pipelines/jobs-steps-average-timeGET /pipelines/jobs-steps-average-time-by-dayGET /pipelines/filter-optionsGET /pipelines/jobs
Common query params:
start_date,end_datetimezoneworkflow_pathstatus,conclusionjob_name,branch,eventaggregate_by,top
Source Code
GET /code/pairing-indexGET /code/code-churnGET /code/couplingGET /code/entity-churnGET /code/entity-effortGET /code/entity-ownershipGET /code/authorsGET /code/big-oGET /code/big-o/file
Common query params:
start_date,end_datetimezoneauthorsignore_files,include_onlytoptype_churn
Jira
GET /jira/issues
Common query params:
statusstartDate,endDate
SonarQube
GET /sonarqube/qualityGET /sonarqube/component-treeGET /sonarqube/measurementsGET /sonarqube/measurements/historyGET /sonarqube/component-tree/history
Common query params:
measurescomponent,depth,metricsignore_files,include_files,remove_folders
Logging
The REST API has two logging layers:
Domain service logging
The core business logic (Jira, SonarQube, PRs, pipelines, etc.) always respects the project's configured log_level, <REPO>_LOGGING_LEVEL env var, or falls back to CRITICAL. These logs use the standard SMM log format ([timestamp] [LEVEL] [serviceName] message) and can optionally write to the log file if store_logs is enabled.
HTTP-level logging
Request logging (middleware), controller debug/error messages, exception filters, and the startup banner use SmmNestLogger — a NestJS LoggerService wrapper around the SMM logger. Its level is controlled by the DEBUG environment variable only:
DEBUG=true— all messages visible (equivalent to INFO level)- No
DEBUG— only fatal logs appear (CRITICAL level)
To see HTTP request logs in development:
DEBUG=true smm dashboard serveOr with the binary directly:
DEBUG=true PORT=8000 node apps/rest/dist/main.jsHTTP-level logging does not currently read per-project `log_level` from `smm_config.json`. Domain service logs
always respect it. If you need HTTP logs, use `DEBUG=true`.Configuration
GET /configuration
Returns active runtime configuration values used by dashboard and API integrations.