OutSystems ODC Code Quality API
REST endpoints to submit code analysis requests and retrieve code quality findings, application scores and analysis results — the technical-debt surface of the platform.
REST endpoints to submit code analysis requests and retrieve code quality findings, application scores and analysis results — the technical-debt surface of the platform.
{
"openapi": "3.0.3",
"info": {
"title": "Code Quality API",
"description": "Provides APIs to submit code analysis requests and retrieve information about code quality findings, application scores, and analysis results.",
"version": "v1"
},
"servers": [
{
"url": "https://ODC_PORTAL_DOMAIN/api/code-quality/v1",
"description": "Replace ODC_PORTAL_DOMAIN with the domain of your organization."
},
{
"url": "https://{odc-portal-domain}/api/code-quality/v1",
"description": "Replace {odc-portal-domain} with the domain of your organization.",
"variables": {
"odc-portal-domain": {
"default": "ODC_PORTAL_DOMAIN",
"description": "The domain of your organization"
}
}
}
],
"paths": {
"/code-analyses/{analysisKey}": {
"get": {
"tags": [],
"summary": "Retrieves the details of a code analysis request.",
"description": "Retrieves the current status and results of a code analysis request, including quality score and findings.\n\nExample: GET /code-quality/v1/code-analyses/be77b25f-c738-462f-8f19-7114fc4f9923\n\nAPI Client needs the **Analyze > View Code Quality findings** permission.",
"operationId": "CodeAnalysisControllerV_GetAnalysisRequestStatus",
"parameters": [
{
"name": "analysisKey",
"in": "path",
"description": "The unique identifier (GUID) of the analysis request",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "Limit",
"in": "query",
"description": "Number of findings to return in the response.",
"schema": {
"maximum": 2147483647,
"minimum": 1,
"type": "integer",
"format": "int32",
"example": 25
},
"example": 25
},
{
"name": "Offset",
"in": "query",
"description": "Number of findings to skip for pagination.",
"schema": {
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"format": "int32",
"example": 10
},
"example": 10
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CodeAnalysisStatusResponseV1"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"default": {
"description": "Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CodeAnalysisStatusResponseV1"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
],
"x-os-permissions": "API Client needs the **Analyze > View Code Quality findings** permission."
}
},
"/code-analyses": {
"post": {
"tags": [],
"summary": "Submits a code analysis request for an asset revision.",
"description": "Initiates code analysis for a specific asset revision, returning an analysis key for status tracking.\n\nExample: POST /code-quality/v1/code-analyses\n\nAPI Client needs the **Analyze > Manage code quality findings** permission.",
"operationId": "CodeAnalysisControllerV_SubmitCodeAnalysisRequest",
"requestBody": {
"description": "The analysis request containing the asset key and revision to analyze",
"content": {
"application/json": {
"schema": {
"title": "CodeAnalysisRequest",
"allOf": [
{
"$ref": "#/components/schemas/AdhocAnalysisRequestV1"
}
]
}
},
"application/*+json": {
"schema": {
"title": "CodeAnalysisRequest",
"allOf": [
{
"$ref": "#/components/schemas/AdhocAnalysisRequestV1"
}
]
}
}
}
},
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CodeAnalysisResponseV1"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"default": {
"description": "Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CodeAnalysisResponseV1"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
],
"x-os-permissions": "API Client needs the **Analyze > Manage code quality findings** permission."
}
},
"/findings": {
"get": {
"tags": [],
"summary": "Retrieves a list of code quality findings.",
"description": "Retrieves a paginated list of code quality findings with comprehensive filtering, sorting, and field selection capabilities.\n\nExample: GET /code-quality/v1/findings?assetKeys=abc123&severities=High&status=Open&limit=20\n\nAPI Client needs the **Analyze > View Code Quality findings** permission.",
"operationId": "FindingsControllerV_GetFindings",
"parameters": [
{
"name": "AssetKeys",
"in": "query",
"description": "Filter by asset keys (unique identifiers).",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "IsLatest",
"in": "query",
"description": "Filter to return only findings from the most recent analysis snapshot.",
"schema": {
"type": "boolean",
"example": true
},
"example": true
},
{
"name": "Sort",
"in": "query",
"description": "Sort results by specified fields.",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "Fields",
"in": "query",
"description": "Select specific fields to return in the response.",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "Categories",
"in": "query",
"description": "Filter by finding categories.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Categories"
}
}
},
{
"name": "Status",
"in": "query",
"description": "Filter by finding status.",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "AssetType",
"in": "query",
"description": "Filter by asset type.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/AssetType"
}
}
},
{
"name": "Severities",
"in": "query",
"description": "Filter by finding severity levels.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FindingSeverity"
}
}
},
{
"name": "PatternIds",
"in": "query",
"description": "Filter by code pattern identifiers.",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "Since",
"in": "query",
"description": "Start date for filtering findings by discovery time. Default: if omitted, 14 days before `To` (or 14 days before now, if `To` is also omitted).",
"schema": {
"type": "string",
"example": "2022-06-01T00:00:00"
},
"example": "2022-06-01T00:00:00"
},
{
"name": "To",
"in": "query",
"description": "End date for filtering findings by discovery time. Default: if omitted, now (current UTC time).",
"schema": {
"type": "string",
"example": "2022-12-31T23:59:59"
},
"example": "2022-12-31T23:59:59"
},
{
"name": "Limit",
"in": "query",
"description": "Number of records to return per page.",
"schema": {
"maximum": 1000,
"minimum": 1,
"type": "integer",
"format": "int32",
"example": 50
},
"example": 50
},
{
"name": "Offset",
"in": "query",
"description": "Number of records to skip for pagination.",
"schema": {
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"format": "int32",
"example": 100
},
"example": 100
},
{
"name": "PortfolioKey",
"in": "query",
"description": "Filter by portfolio key.",
"schema": {
"type": "string",
"format": "uuid",
"example": "12345678-1234-1234-1234-123456789abc"
},
"example": "12345678-1234-1234-1234-123456789abc"
},
{
"name": "CreatedBy",
"in": "query",
"description": "Filter by creator user IDs.",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FindingsResponseV1PagedListResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"default": {
"description": "Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FindingsResponseV1PagedListResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
],
"x-os-permissions": "API Client needs the **Analyze > View Code Quality findings** permission."
}
},
"/assets-quality-metrics": {
"get": {
"tags": [],
"summary": "Retrieves quality metrics for assets.",
"description": "Retrieves quality metrics and findings distribution for assets, including quality scores and findings grouped by severity and status, with comparison to previous analysis.\n\nExample: GET /code-quality/v1/assets-quality-metrics?assetType=Application&limit=50&sort=-score\n\nAPI Client needs the **Analyze > View Code Quality findings** permission.",
"operationId": "FindingsOverviewControllerV_GetAppsOverview",
"parameters": [
{
"name": "AssetKeys",
"in": "query",
"description": "Filter by asset keys (unique identifiers).",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "Sort",
"in": "query",
"description": "Sort results by specified fields.",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "Status",
"in": "query",
"description": "Filter by finding status.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FindingStatus"
}
}
},
{
"name": "AssetType",
"in": "query",
"description": "Filter by asset type.",
"schema": {
"type": "string",
"example": "WebApplication"
},
"example": "WebApplication"
},
{
"name": "Categories",
"in": "query",
"description": "Filter by finding categories.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Categories"
}
}
},
{
"name": "Severities",
"in": "query",
"description": "Filter by finding severity levels.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FindingSeverity"
}
}
},
{
"name": "Since",
"in": "query",
"description": "Start date for filtering findings by discovery time. Default: if omitted, 14 days before `To` (or 14 days before now, if `To` is also omitted).",
"schema": {
"type": "string",
"example": "2022-06-01T00:00:00"
},
"example": "2022-06-01T00:00:00"
},
{
"name": "To",
"in": "query",
"description": "End date for filtering findings by discovery time. Default: if omitted, now (current UTC time).",
"schema": {
"type": "string",
"example": "2022-12-31T23:59:59"
},
"example": "2022-12-31T23:59:59"
},
{
"name": "ScoreRanges",
"in": "query",
"description": "Filter by quality score ranges. Default: includes all scores.",
"schema": {
"type": "string",
"example": "0-49,50-84,85-100"
},
"example": "\"0-49,50-84,85-100\""
},
{
"name": "Limit",
"in": "query",
"description": "Number of records to return per page.",
"schema": {
"maximum": 1000,
"minimum": 1,
"type": "integer",
"format": "int32",
"example": 50
},
"example": 50
},
{
"name": "Offset",
"in": "query",
"description": "Number of records to skip for pagination.",
"schema": {
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"format": "int32",
"example": 100
},
"example": 100
},
{
"name": "PortfolioKey",
"in": "query",
"description": "Filter by portfolio key.",
"schema": {
"type": "string",
"format": "uuid",
"example": "12345678-1234-1234-1234-123456789abc"
},
"example": "12345678-1234-1234-1234-123456789abc"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AppsOverviewResponseV1PagedListResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"default": {
"description": "Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AppsOverviewResponseV1PagedListResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
],
"x-os-permissions": "API Client needs the **Analyze > View Code Quality findings** permission."
}
},
"/assets/{assetKey}/revisions/{revision}/analysis-summary": {
"get": {
"tags": [],
"summary": "Retrieves the analysis summary for an asset revision.",
"description": "Retrieves the analysis summary for a specific asset revision, including findings breakdown by severity and the quality score.\n\nExample: GET /code-quality/v1/assets/53fcbdc7-be3c-4532-866c-a296336133b0/revisions/8/analysis-summary\n\nAPI Client needs the **Analyze > View Code Quality findings** permission.",
"operationId": "FindingsOverviewControllerV_GetAssetRevisionFindingsSummary",
"parameters": [
{
"name": "assetKey",
"in": "path",
"description": "The unique identifier of the asset",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "revision",
"in": "path",
"description": "The revision number of the asset to retrieve analysis for",
"required": true,
"schema": {
"type": "integer",
"format": "int64"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetRevisionSummaryResponse"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"default": {
"description": "Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AssetRevisionSummaryResponse"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
],
"x-os-permissions": "API Client needs the **Analyze > View Code Quality findings** permission."
}
},
"/findings-summary": {
"get": {
"tags": [],
"summary": "Retrieves a multi-dimensional findings summary.",
"description": "Retrieves a multi-dimensional summary of findings, aggregated by customizable grouping parameters such as category, status, and severity.\n\nExample: GET /code-quality/v1/findings-summary?groupBy=Category,Status,Severity&categories=Security\n\nAPI Client needs the **Analyze > View Code Quality findings** permission.",
"operationId": "FindingsOverviewControllerV_GetFindingsSummary",
"parameters": [
{
"name": "AssetKeys",
"in": "query",
"description": "Filter by asset keys (unique identifiers).",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "GroupBy",
"in": "query",
"description": "Grouping parameters for organizing the findings summary.",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "FetchChange",
"in": "query",
"description": "Include changes compared to previous analysis.",
"schema": {
"type": "boolean",
"example": true
},
"example": true
},
{
"name": "AssetType",
"in": "query",
"description": "Filter by asset type.",
"schema": {
"type": "string",
"example": "WebApplication"
},
"example": "WebApplication"
},
{
"name": "Categories",
"in": "query",
"description": "Filter by finding categories.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Categories"
}
}
},
{
"name": "Severities",
"in": "query",
"description": "Filter by finding severity levels.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FindingSeverity"
}
}
},
{
"name": "Since",
"in": "query",
"description": "Start date for filtering findings by discovery time. Default: if omitted, 14 days before `To` (or 14 days before now, if `To` is also omitted).",
"schema": {
"type": "string",
"example": "2022-06-01T00:00:00"
},
"example": "2022-06-01T00:00:00"
},
{
"name": "To",
"in": "query",
"description": "End date for filtering findings by discovery time. Default: if omitted, now (current UTC time).",
"schema": {
"type": "string",
"example": "2022-12-31T23:59:59"
},
"example": "2022-12-31T23:59:59"
},
{
"name": "ScoreRanges",
"in": "query",
"description": "Filter by quality score ranges. Default: includes all scores.",
"schema": {
"type": "string",
"example": "0-49,50-84,85-100"
},
"example": "\"0-49,50-84,85-100\""
},
{
"name": "Limit",
"in": "query",
"description": "Number of records to return per page.",
"schema": {
"maximum": 1000,
"minimum": 1,
"type": "integer",
"format": "int32",
"example": 50
},
"example": 50
},
{
"name": "Offset",
"in": "query",
"description": "Number of records to skip for pagination.",
"schema": {
"maximum": 2147483647,
"minimum": 0,
"type": "integer",
"format": "int32",
"example": 100
},
"example": 100
},
{
"name": "PortfolioKey",
"in": "query",
"description": "Filter by portfolio key.",
"schema": {
"type": "string",
"format": "uuid",
"example": "12345678-1234-1234-1234-123456789abc"
},
"example": "12345678-1234-1234-1234-123456789abc"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FindingsSummaryResponseV1"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"404": {
"description": "Not Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"default": {
"description": "Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FindingsSummaryResponseV1"
}
}
}
}
},
"security": [
{
"bearerAuth": []
}
],
"x-os-permissions": "API Client needs the **Analyze > View Code Quality findings** permission."
}
},
"/findings-trend": {
"get": {
"tags": [],
"summary": "Retrieves historical trend data for findings.",
"description": "Retrieves historical trend data for findings over time, showing how findings and quality scores evolved across analyses. Useful for visualizing trends and patterns over time.\n\nExample: GET /code-quality/v1/findings-trend?assetKeys=abc123&since=2024-01-01&to=2024-12-31\n\nAPI Client needs the **Analyze > View Code Quality findings** permission.",
"operationId": "FindingsOverviewControllerV_GetFindingsTrend",
"parameters": [
{
"name": "AssetKeys",
"in": "query",
"description": "Filter by asset keys (unique identifiers).",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "AssetType",
"in": "query",
"description": "Filter by asset type.",
"schema": {
"type": "string",
"example": "WebApplication"
},
"example": "WebApplication"
},
{
"name": "Categories",
"in": "query",
"description": "Filter by finding categories.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Categories"
}
}
},
{
"name": "Severities",
"in": "query",
"description": "Filter by finding severity levels.",
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/FindingSeverity"
}
}
},
{
"name": "Since",
"in": "query",
"description": "Start date for filtering findings by discovery time. Default: if omitted, 14 days before `To` (or 14 days before now, if `To` is also omitted).",
"schema": {
"type": "string",
"example": "2022-06-01T00:00:00"
},
"example": "2022-06-01T00:00:00"
},
{
"name": "To",
"in": "query",
"description": "End date for filtering findings by discovery time. Default: if omitted, now (current UTC time).",
"schema": {
"type": "string",
"example": "2022-12-31T23:59:59"
},
"example": "2022-12-31T23:59:59"
},
{
"name": "ScoreRanges",
"in": "query",
"description": "Filter by quality score ranges. Default: includes all scores.",
"schema": {
"type": "string",
"example": "0-49,50-84,85-100"
},
"example": "\"0-49,50-84,85-100\""
},
{
"name": "Limit",
"in": "query",
"description": "Number of records to return per page.",
"schema": {
"maximum": 1000,
"minimum": 1,
"type": "integer",
"format": "int32",
"example": 50
},
"example": 50
},
{
"name": "Offset",
"in
# --- truncated at 32 KB (74 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/outsystems/refs/heads/main/openapi/outsystems-code-quality-api-v1-openapi.json