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.

OpenAPI Specification

outsystems-code-quality-api-v1-openapi.json Raw ↑
{
  "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