{
  "openapi": "3.1.1",
  "info": {
    "title": "Routebase Public API",
    "description": "This reference covers the part of the Routebase API that is a commitment to\ncustomers. Every endpoint here is called by a shipped Routebase client, so it is\nalready a contract in practice. The test CLI on nuget.org drives the CI, spec,\nsecurity and docs-as-code groups, and identity providers such as Okta and\nMicrosoft Entra drive the SCIM group.\n\nEverything else under \u0060/api/**\u0060 serves the Routebase web app, can change without\nnotice, and should not be built against.\n\nThe API is not versioned by path, and the version above numbers this document\nrather than the API. A breaking change here is announced in the release notes\nbefore it ships.\n\n## Authentication\n\nSend an API key in the \u0060X-API-Key\u0060 header. Keys are created under Settings then\nAPI Keys, they start with \u0060rb_live_\u0060, and each one carries its own permission\nscopes and an optional restriction to a single project. A scoped key cannot reach\norganization level operations at all, so grant the least privilege that works.\n\nSCIM is the exception and authenticates with a separate bearer token, issued per\norganization when SCIM provisioning is enabled.\n\n## Regions\n\nAn organization lives in exactly one region. US organizations must send the\n\u0060X-RB-Region\u0060 header documented on every operation, otherwise the request is\nrouted to the EU region and answered with 401.\n\n## Rate limits\n\nRequests are counted in a rolling window of 60 seconds. A call authenticated with\nan API key gets 100 requests per window, counted per user of that key. SCIM is\ncounted per source IP instead, so every call from one identity provider shares a\nsingle budget. Exceeding it answers \u0060429\u0060 with a \u0060Retry-After\u0060 header, which a\npolling CI job should honour rather than retry immediately.\n\n## Errors\n\nFailures return \u0060application/problem\u002Bjson\u0060 with a machine readable \u0060code\u0060 field.\nRead that rather than the human readable \u0060detail\u0060, which may be reworded. SCIM\nendpoints return the SCIM error envelope instead. Every identifier in this API is\na public UUID.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://api.routebase.dev"
    }
  ],
  "paths": {
    "/api/cli/environments": {
      "get": {
        "tags": [
          "CI \u0026 Test Runs"
        ],
        "summary": "List the environments of a project",
        "description": "Returns the environments of a project, so a pipeline can pick the one whose\nvariables the run should use. An environment marked \u0060isReadOnly\u0060 rejects every\nwrite request sent to it, and the test cases concerned are reported as blocked\nrather than failed.\n",
        "operationId": "cliListEnvironments",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectIdQuery"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The environments of the project.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Environment"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "CI \u0026 Test Runs"
      }
    },
    "/api/cli/run": {
      "post": {
        "tags": [
          "CI \u0026 Test Runs"
        ],
        "summary": "Run a test suite and wait for the result",
        "description": "Executes a test suite and returns the outcome in one call, which is what a\npipeline step needs. The response tells you whether everything passed, so a\nCI job can fail on \u0060allPassed\u0060 alone. Pass a \u0060reportFormat\u0060 to get the report\ninline instead of downloading it separately.\n\nThe call blocks until the run finishes. For a long suite, send \u0060progressRunId\u0060\nand poll the status endpoint instead of holding the connection open.\n",
        "operationId": "cliRunTestSuite",
        "parameters": [
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CliRunRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The run completed. Check \u0060allPassed\u0060 for the verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CliRunResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "CI \u0026 Test Runs"
      }
    },
    "/api/cli/runs/{id}/report": {
      "get": {
        "tags": [
          "CI \u0026 Test Runs"
        ],
        "summary": "Download the report of a finished run",
        "description": "Returns the run report as a file. JUnit XML is the default because GitHub\nActions, Azure Pipelines and Jenkins all read it natively.\n\nThe run has to be finished. Asking for the report of a pending or running test\nrun is answered with 409, so poll the status endpoint first.\n",
        "operationId": "cliDownloadReport",
        "parameters": [
          {
            "name": "format",
            "in": "query",
            "description": "Report format. Defaults to \u0060junit\u0060.",
            "schema": {
              "enum": [
                "junit",
                "json",
                "html"
              ],
              "type": "string",
              "default": "junit"
            }
          },
          {
            "name": "id",
            "in": "path",
            "description": "Public id of the test run.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The report file.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "description": "The run is still pending or running, so there is no report yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "CI \u0026 Test Runs"
      }
    },
    "/api/cli/runs/{id}/status": {
      "get": {
        "tags": [
          "CI \u0026 Test Runs"
        ],
        "summary": "Get the progress of a test run",
        "description": "Returns how far a run has come, which lets a pipeline show progress instead of\nwaiting silently. While the run is going, \u0060currentDurationMs\u0060 counts up and\n\u0060completedAt\u0060 stays null.\n",
        "operationId": "cliGetRunStatus",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Public id of the test run.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The current status of the run.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CliRunStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "CI \u0026 Test Runs"
      }
    },
    "/api/cli/suites": {
      "get": {
        "tags": [
          "CI \u0026 Test Runs"
        ],
        "summary": "List the test suites of a project",
        "description": "Returns the test suites of a project so a pipeline can resolve a suite by name.",
        "operationId": "cliListSuites",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectIdQuery"
          },
          {
            "$ref": "#/components/parameters/Skip"
          },
          {
            "$ref": "#/components/parameters/Take"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of test suites.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestSuiteList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "CI \u0026 Test Runs"
      }
    },
    "/api/projects/{projectId}/docs": {
      "get": {
        "tags": [
          "Docs as Code"
        ],
        "summary": "List the documentations of a project",
        "description": "Returns the documentations of a project with their versions, which is how a\npipeline finds the id of the version it should write into. Only a version whose\nstatus is \u0060draft\u0060 or \u0060review\u0060 accepts changes, so pick one of those.\n",
        "operationId": "getDocumentations",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The documentations of the project.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetDocumentationsResult"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Docs as Code"
      }
    },
    "/api/projects/{projectId}/docs/{docId}/versions/{versionId}/folders": {
      "post": {
        "tags": [
          "Docs as Code"
        ],
        "summary": "Create a folder",
        "description": "Creates a folder in a version. A folder with \u0060isSection\u0060 set becomes a top level\nsection in the portal header rather than an entry in the sidebar, and only a\nfolder at the root can be one.\n",
        "operationId": "createDocFolder",
        "parameters": [
          {
            "$ref": "#/components/parameters/DocId"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/DocVersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDocFolderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "The folder was created.",
            "headers": {
              "Location": {
                "description": "URL of the new folder.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateDocFolderResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Docs as Code"
      }
    },
    "/api/projects/{projectId}/docs/{docId}/versions/{versionId}/pages": {
      "post": {
        "tags": [
          "Docs as Code"
        ],
        "summary": "Create a page",
        "description": "Creates a page inside a version, at the root or under a folder. The slug is\nderived from the title when you do not send one, and it is what the public\nportal URL is built from, so set it explicitly if the URL matters to you.\n",
        "operationId": "createDocPage",
        "parameters": [
          {
            "$ref": "#/components/parameters/DocId"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/DocVersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDocPageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "The page was created.",
            "headers": {
              "Location": {
                "description": "URL of the new page.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateDocPageResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Docs as Code"
      }
    },
    "/api/projects/{projectId}/docs/{docId}/versions/{versionId}/pages/{pageId}": {
      "get": {
        "tags": [
          "Docs as Code"
        ],
        "summary": "Get a page with its content",
        "description": "Returns one page including its Markdown content and its \u0060rowVersion\u0060. Send that\n\u0060rowVersion\u0060 back on the next update and a concurrent edit is rejected with 409\ninstead of silently overwriting someone else\u0027s work.\n",
        "operationId": "getDocPageDetail",
        "parameters": [
          {
            "$ref": "#/components/parameters/DocId"
          },
          {
            "$ref": "#/components/parameters/PageId"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/DocVersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocPageDetail"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Docs as Code"
      },
      "put": {
        "tags": [
          "Docs as Code"
        ],
        "summary": "Update a page",
        "description": "Replaces the title and content of a page, which is the call that carries a\nMarkdown file from your repository into Routebase. A page that a person has\nlocked in the editor is not writable, and the call is rejected until the lock is\nreleased.\n",
        "operationId": "updateDocPage",
        "parameters": [
          {
            "$ref": "#/components/parameters/DocId"
          },
          {
            "$ref": "#/components/parameters/PageId"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/DocVersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDocPageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The updated page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocPageDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Docs as Code"
      }
    },
    "/api/projects/{projectId}/docs/{docId}/versions/{versionId}/tree": {
      "get": {
        "tags": [
          "Docs as Code"
        ],
        "summary": "Get the page tree of a version",
        "description": "Returns the full hierarchy of a documentation version. Each node is exactly one\nof a page, a folder or an API reference snapshot, and the \u0060type\u0060 field says\nwhich of the three is filled.\n\nThe response carries an ETag, so a pipeline that syncs repeatedly can send\n\u0060If-None-Match\u0060 and skip the work when nothing moved.\n",
        "operationId": "getDocTree",
        "parameters": [
          {
            "$ref": "#/components/parameters/DocId"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/DocVersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The documentation tree.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocTree"
                }
              }
            }
          },
          "304": {
            "description": "Nothing changed since the ETag you sent."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Docs as Code"
      }
    },
    "/api/projects/{projectId}/docs/{docId}/versions/{versionId}/tree/reorder": {
      "put": {
        "tags": [
          "Docs as Code"
        ],
        "summary": "Reorder the items under one parent",
        "description": "Sets the order of the items inside one folder, or at the root when\n\u0060parentFolderPublicId\u0060 is null. Send the complete list of ids in the order you\nwant, because the position of an item is its index in that list.\n",
        "operationId": "reorderTreeItems",
        "parameters": [
          {
            "$ref": "#/components/parameters/DocId"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/DocVersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReorderTreeItemsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "The order was applied."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Docs as Code"
      }
    },
    "/api/projects/{projectId}/security/findings": {
      "get": {
        "tags": [
          "Security"
        ],
        "summary": "List security findings",
        "description": "Returns the findings of a project across all scans, filtered as you need them.\nA pipeline that only wants to know whether anything new broke should filter on\n\u0060status=open\u0060 and on the severities it cares about.\n",
        "operationId": "getSecurityFindings",
        "parameters": [
          {
            "name": "assignedToMe",
            "in": "query",
            "description": "Return only findings assigned to the calling user.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "name": "scannerId",
            "in": "query",
            "description": "Filter by the scanner that produced the finding.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "in": "query",
            "description": "Free-text search across title and description.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "severity",
            "in": "query",
            "description": "Filter by severity.",
            "schema": {
              "$ref": "#/components/schemas/Severity"
            }
          },
          {
            "$ref": "#/components/parameters/Skip"
          },
          {
            "name": "sortBy",
            "in": "query",
            "description": "Sort order of the result.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Filter by finding status.",
            "schema": {
              "$ref": "#/components/schemas/FindingStatus"
            }
          },
          {
            "name": "take",
            "in": "query",
            "description": "Maximum number of items to return. Defaults to 50.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of findings.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SecurityFindingList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Security"
      }
    },
    "/api/projects/{projectId}/security/findings/export/sarif": {
      "get": {
        "tags": [
          "Security"
        ],
        "summary": "Export findings as SARIF",
        "description": "Returns the findings of a project as a SARIF 2.1.0 document, which GitHub code\nscanning and comparable tools ingest directly. Upload it from your pipeline and\nthe findings show up next to the code they concern. Without a \u0060status\u0060 filter it\nreturns the open ones, which is what a build gate wants.\n",
        "operationId": "exportSecurityFindingsSarif",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "name": "status",
            "in": "query",
            "description": "Filter by finding status. Defaults to \u0060open\u0060.",
            "schema": {
              "$ref": "#/components/schemas/FindingStatus"
            }
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The SARIF document.",
            "content": {
              "application/sarif\u002Bjson": {
                "schema": {
                  "type": "string",
                  "description": "A SARIF 2.1.0 document."
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Security"
      }
    },
    "/api/projects/{projectId}/security/scan-profiles/{profileId}/run": {
      "post": {
        "tags": [
          "Security"
        ],
        "summary": "Start a security scan",
        "description": "Queues a scan for the given profile and returns immediately with the tracking id,\nbecause a scan runs in the background. Poll the scan run endpoint until its\nstatus leaves \u0060queued\u0060 and \u0060running\u0060.\n",
        "operationId": "enqueueScanRun",
        "parameters": [
          {
            "name": "profileId",
            "in": "path",
            "description": "Public id of the scan profile.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "The scan was queued.",
            "headers": {
              "Location": {
                "description": "URL of the scan run to poll.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScanRun"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Security"
      }
    },
    "/api/projects/{projectId}/security/scan-runs/{runId}": {
      "get": {
        "tags": [
          "Security"
        ],
        "summary": "Get a scan run",
        "description": "Returns the state of a scan, including how many scanners have finished and which\none is running. Once \u0060status\u0060 is \u0060completed\u0060, \u0060securityScore\u0060 and\n\u0060openFindingsCount\u0060 are final and a pipeline can gate on them.\n",
        "operationId": "getScanRunById",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "name": "runId",
            "in": "path",
            "description": "Public id of the scan run.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The scan run.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScanRun"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "Security"
      }
    },
    "/api/projects/{projectId}/specs": {
      "get": {
        "tags": [
          "API Specs"
        ],
        "summary": "List the specifications of a project",
        "description": "Returns the specifications of a project together with the number of their\nlatest published version, so a pipeline can resolve a spec by name and see at a\nglance what is live.\n",
        "operationId": "getApiSpecs",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/Skip"
          },
          {
            "$ref": "#/components/parameters/Take"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of specifications.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiSpecList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "API Specs"
      }
    },
    "/api/projects/{projectId}/specs/{specId}/export": {
      "get": {
        "tags": [
          "API Specs"
        ],
        "summary": "Export the current state of a specification",
        "description": "Returns the working state of a specification as OpenAPI, which is the draft as\nit stands in the designer right now. To export something stable, export a\npublished version instead.\n",
        "operationId": "exportApiSpec",
        "parameters": [
          {
            "$ref": "#/components/parameters/SpecFormat"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/SpecId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The specification document.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "API Specs"
      }
    },
    "/api/projects/{projectId}/specs/{specId}/versions": {
      "get": {
        "tags": [
          "API Specs"
        ],
        "summary": "List the versions of a specification",
        "description": "Returns the versions of a specification with their status and publish target.\nOnly a version whose status is \u0060published\u0060 is frozen, so anything else can still\nchange underneath you.\n",
        "operationId": "getSpecVersions",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/Skip"
          },
          {
            "$ref": "#/components/parameters/SpecId"
          },
          {
            "$ref": "#/components/parameters/Take"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of versions.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpecVersionList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "API Specs"
      }
    },
    "/api/projects/{projectId}/specs/{specId}/versions/{versionId}/export": {
      "get": {
        "tags": [
          "API Specs"
        ],
        "summary": "Export a published version",
        "description": "Returns a published version as a downloadable OpenAPI document. A published\nversion is frozen, so the same call returns the same bytes forever, which makes\nit safe to generate clients from in a build.\n",
        "operationId": "exportSpecVersion",
        "parameters": [
          {
            "$ref": "#/components/parameters/SpecFormat"
          },
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/SpecId"
          },
          {
            "$ref": "#/components/parameters/VersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The specification document as a file.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "API Specs"
      }
    },
    "/api/projects/{projectId}/specs/{specId}/versions/{versionId}/promote": {
      "post": {
        "tags": [
          "API Specs"
        ],
        "summary": "Record that a version went into an environment",
        "description": "Tells Routebase which version an environment now serves. The intended order is\nthat your pipeline deploys first and then makes this call, so the pin reflects\nwhat is actually running rather than what someone intended.\n\nA call authenticated with an API key is recorded with source \u0060cli\u0060, which is how\na pipeline assertion is told apart from someone clicking in the UI. If the target\nenvironment freezes versions, the promoted version becomes immutable here.\n",
        "operationId": "promoteSpecVersion",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/SpecId"
          },
          {
            "$ref": "#/components/parameters/VersionId"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromoteVersionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The promotion was recorded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromotionResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "description": "The promotion is blocked. The most common reason is an unacknowledged impact\non dependent services, which you clear by sending \u0060impactAcknowledged\u0060.\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "API Specs"
      }
    },
    "/api/projects/{projectId}/test-suites": {
      "get": {
        "tags": [
          "CI \u0026 Test Runs"
        ],
        "summary": "List the test suites of a project",
        "description": "The project scoped equivalent of \u0060/api/cli/suites\u0060, which returns the same page\nof suites. Use whichever fits the path style of your client.\n",
        "operationId": "getTestSuites",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "$ref": "#/components/parameters/Skip"
          },
          {
            "$ref": "#/components/parameters/Take"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of test suites.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestSuiteList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "CI \u0026 Test Runs"
      }
    },
    "/api/projects/{projectId}/test-suites/{suiteId}/execute": {
      "post": {
        "tags": [
          "CI \u0026 Test Runs"
        ],
        "summary": "Execute a test suite",
        "description": "Runs every test case in a suite in order, carrying extracted variables from one\ncase into the next. This is the full result shape, so it also carries the\nper-case detail, the seed results and the performance metrics that\n\u0060/api/cli/run\u0060 leaves out.\n\nSet \u0060persistResults\u0060 to false for a dry run that leaves no test run behind.\n",
        "operationId": "executeTestSuite",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProjectId"
          },
          {
            "name": "suiteId",
            "in": "path",
            "description": "Public id of the test suite.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExecuteTestSuiteRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run completed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestSuiteExecutionResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-routebase-folder-path": "CI \u0026 Test Runs"
      }
    },
    "/scim/v2/{orgSlug}/Groups": {
      "get": {
        "tags": [
          "SCIM"
        ],
        "summary": "List groups",
        "description": "Returns the provisioned groups of an organization in a SCIM ListResponse\nenvelope. Groups map onto Routebase teams, and a group mapping decides which\nrole its members receive.\n",
        "operationId": "scimListGroups",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimCount"
          },
          {
            "name": "filter",
            "in": "query",
            "description": "SCIM filter expression, for example \u0060displayName eq \u0022Engineering\u0022\u0060.",
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "$ref": "#/components/parameters/ScimStartIndex"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A SCIM ListResponse of groups.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimGroupListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ScimError"
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      },
      "post": {
        "tags": [
          "SCIM"
        ],
        "summary": "Provision a group",
        "description": "Creates a group and adds the members you send with it.",
        "operationId": "scimCreateGroup",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/scim\u002Bjson": {
              "schema": {
                "$ref": "#/components/schemas/ScimGroupResource"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "The group was provisioned.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimGroupResource"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ScimError"
          },
          "409": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      }
    },
    "/scim/v2/{orgSlug}/Groups/{id}": {
      "get": {
        "tags": [
          "SCIM"
        ],
        "summary": "Get a group",
        "description": "Returns one provisioned group with its members.",
        "operationId": "scimGetGroup",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimId"
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The group.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimGroupResource"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      },
      "patch": {
        "tags": [
          "SCIM"
        ],
        "summary": "Patch a group",
        "description": "Applies a SCIM PatchOp to a group, which is how an identity provider adds and\nremoves members as people join and leave a team.\n",
        "operationId": "scimPatchGroup",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimId"
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/scim\u002Bjson": {
              "schema": {
                "$ref": "#/components/schemas/ScimPatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The patched group.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimGroupResource"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ScimError"
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      },
      "delete": {
        "tags": [
          "SCIM"
        ],
        "summary": "Deprovision a group",
        "description": "Removes a group. Its members keep their organization membership.",
        "operationId": "scimDeleteGroup",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimId"
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The group was removed."
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      }
    },
    "/scim/v2/{orgSlug}/ResourceTypes": {
      "get": {
        "tags": [
          "SCIM"
        ],
        "summary": "List the supported resource types",
        "description": "Returns the SCIM resource types this service exposes, which are User and Group.",
        "operationId": "scimResourceTypes",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The resource types.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      }
    },
    "/scim/v2/{orgSlug}/Schemas": {
      "get": {
        "tags": [
          "SCIM"
        ],
        "summary": "List the supported schemas",
        "description": "Returns the SCIM schemas backing the User and Group resources.",
        "operationId": "scimSchemas",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The schemas.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      }
    },
    "/scim/v2/{orgSlug}/ServiceProviderConfig": {
      "get": {
        "tags": [
          "SCIM"
        ],
        "summary": "Describe what this SCIM service supports",
        "description": "Returns the SCIM service provider configuration, which identity providers read\nduring setup to learn which operations are available.\n",
        "operationId": "scimServiceProviderConfig",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The service provider configuration.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      }
    },
    "/scim/v2/{orgSlug}/Users": {
      "get": {
        "tags": [
          "SCIM"
        ],
        "summary": "List users",
        "description": "Returns the provisioned users of an organization in a SCIM ListResponse\nenvelope. Identity providers use the \u0060filter\u0060 parameter to look a user up by\n\u0060userName\u0060 before deciding whether to create or update.\n",
        "operationId": "scimListUsers",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimCount"
          },
          {
            "name": "filter",
            "in": "query",
            "description": "SCIM filter expression, for example \u0060userName eq \u0022ada@example.com\u0022\u0060.",
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "$ref": "#/components/parameters/ScimStartIndex"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A SCIM ListResponse of users.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUserListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ScimError"
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      },
      "post": {
        "tags": [
          "SCIM"
        ],
        "summary": "Provision a user",
        "description": "Creates a user in the organization. A user provisioned this way joins with the\ndefault member role, and further role changes stay with Routebase rather than\nthe identity provider.\n",
        "operationId": "scimCreateUser",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/scim\u002Bjson": {
              "schema": {
                "$ref": "#/components/schemas/ScimUserResource"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "The user was provisioned.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUserResource"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ScimError"
          },
          "409": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      }
    },
    "/scim/v2/{orgSlug}/Users/{id}": {
      "get": {
        "tags": [
          "SCIM"
        ],
        "summary": "Get a user",
        "description": "Returns one provisioned user.",
        "operationId": "scimGetUser",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimId"
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The user.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUserResource"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      },
      "put": {
        "tags": [
          "SCIM"
        ],
        "summary": "Replace a user",
        "description": "Replaces the attributes of a user wholesale. Attributes you leave out are\ncleared, so send the complete resource rather than a partial one.\n",
        "operationId": "scimReplaceUser",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimId"
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/scim\u002Bjson": {
              "schema": {
                "$ref": "#/components/schemas/ScimUserResource"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The updated user.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUserResource"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ScimError"
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      },
      "patch": {
        "tags": [
          "SCIM"
        ],
        "summary": "Patch a user",
        "description": "Applies a SCIM PatchOp to a user. This is the call an identity provider makes to\ndeactivate someone, by setting \u0060active\u0060 to false, which is a soft removal that\nkeeps the audit trail intact.\n",
        "operationId": "scimPatchUser",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimId"
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/scim\u002Bjson": {
              "schema": {
                "$ref": "#/components/schemas/ScimPatchRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The patched user.",
            "content": {
              "application/scim\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUserResource"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/ScimError"
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      },
      "delete": {
        "tags": [
          "SCIM"
        ],
        "summary": "Deprovision a user",
        "description": "Removes a user from the organization.",
        "operationId": "scimDeleteUser",
        "parameters": [
          {
            "$ref": "#/components/parameters/ScimId"
          },
          {
            "$ref": "#/components/parameters/OrgSlug"
          },
          {
            "name": "X-RB-Region",
            "in": "header",
            "description": "Region of your organization. US organizations must send \u0060us\u0060; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401.",
            "schema": {
              "type": "string",
              "example": "us"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The user was removed."
          },
          "404": {
            "$ref": "#/components/responses/ScimError"
          },
          "429": {
            "description": "The rate limit was exceeded. The \u0060Retry-After\u0060 header gives the seconds to wait. SCIM is counted per source IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem\u002Bjson": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ScimBearerAuth": []
          }
        ],
        "x-routebase-folder-path": "SCIM"
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "required": [
          "status"
        ],
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "A URI identifying the problem type."
          },
          "title": {
            "type": "string",
            "description": "A short summary of the problem type."
          },
          "status": {
            "type": "integer",
            "description": "The HTTP status code.",
            "format": "int32"
          },
          "detail": {
            "type": "string",
            "description": "A human readable explanation."
          },
          "instance": {
            "type": "string",
            "description": "The path that produced the error."
          },
          "code": {
            "type": "string",
            "description": "The stable machine readable error code, for example \u0060CONCURRENCY_CONFLICT\u0060,\n\u0060PROJECT_LOCKED\u0060, \u0060API_KEY_SCOPE_DENIED\u0060 or \u0060NOT_A_MEMBER\u0060.\n"
          }
        },
        "description": "The error shape of the API, which follows RFC 9457. Branch on \u0060code\u0060, because\n\u0060detail\u0060 is written for people and may be reworded.\n"
      },
      "Severity": {
        "enum": [
          "info",
          "low",
          "medium",
          "high",
          "critical"
        ],
        "type": "string",
        "description": "How serious a security finding is."
      },
      "Confidence": {
        "enum": [
          "low",
          "medium",
          "high"
        ],
        "type": "string",
        "description": "How certain the scanner is that a finding is real."
      },
      "FindingStatus": {
        "enum": [
          "open",
          "inProgress",
          "fixed",
          "falsePositive",
          "acceptedRisk",
          "duplicate"
        ],
        "type": "string",
        "description": "Where a finding stands in triage."
      },
      "ScanStatus": {
        "enum": [
          "queued",
          "running",
          "completed",
          "failed",
          "cancelled"
        ],
        "type": "string",
        "description": "The lifecycle state of a scan run."
      },
      "ScanTrigger": {
        "enum": [
          "manual",
          "scheduled",
          "api",
          "ciCd"
        ],
        "type": "string",
        "description": "What started a scan run."
      },
      "VersionStatus": {
        "enum": [
          "draft",
          "review",
          "published",
          "deprecated"
        ],
        "type": "string",
        "description": "The lifecycle state of a specification version. Only \u0060published\u0060 is frozen and\ntherefore safe to generate clients from.\n"
      },
      "PublishTarget": {
        "enum": [
          "internal",
          "public",
          "exportOnly"
        ],
        "type": "string",
        "description": "Who a published version is visible to."
      },
      "OpenApiVersion": {
        "enum": [
          "v3_0",
          "v3_1"
        ],
        "type": "string",
        "description": "The OpenAPI dialect of a specification."
      },
      "EnvironmentType": {
        "enum": [
          "development",
          "staging",
          "production",
          "custom"
        ],
        "type": "string",
        "description": "The stage an environment stands for."
      },
      "PinSource": {
        "enum": [
          "manual",
          "cli",
          "gatewayDeployment"
        ],
        "type": "string",
        "description": "Where a version pin came from. A call authenticated with an API key is recorded\nas \u0060cli\u0060, which marks it as a pipeline assertion rather than a manual entry.\n"
      },
      "OnErrorBehavior": {
        "enum": [
          "ignore",
          "stop",
          "abort"
        ],
        "type": "string",
        "description": "What a run does when a test case errors. \u0060ignore\u0060 continues, \u0060stop\u0060 ends the\ncurrent iteration but starts the next one, and \u0060abort\u0060 ends the whole run.\n"
      },
      "DocPageType": {
        "enum": [
          "custom",
          "gettingStarted",
          "authentication",
          "environments",
          "errorCodes"
        ],
        "type": "string",
        "description": "The template a documentation page was created from."
      },
      "DocVersionStatus": {
        "enum": [
          "draft",
          "review",
          "published",
          "archived"
        ],
        "type": "string",
        "description": "The lifecycle state of a documentation version. Only \u0060draft\u0060 and \u0060review\u0060 accept\ncontent changes.\n"
      },
      "DocVisibility": {
        "enum": [
          "internal",
          "authenticated",
          "public"
        ],
        "type": "string",
        "description": "Who can read a published documentation version."
      },
      "VersionNumberingScheme": {
        "enum": [
          "semantic",
          "simple",
          "dateBased",
          "custom"
        ],
        "type": "string",
        "description": "How a documentation numbers its versions."
      },
      "CliRunRequest": {
        "required": [
          "projectId",
          "suiteId"
        ],
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "description": "Public id of the project.",
            "format": "uuid"
          },
          "suiteId": {
            "type": "string",
            "description": "Public id of the test suite to run.",
            "format": "uuid"
          },
          "environmentId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Environment whose variables the run substitutes.",
            "format": "uuid"
          },
          "iterations": {
            "type": [
              "null",
              "integer"
            ],
            "description": "How often to run the suite, between 1 and 10000. Defaults to 1.",
            "format": "int32"
          },
          "delayMs": {
            "type": [
              "null",
              "integer"
            ],
            "description": "Pause between iterations in milliseconds, up to 60000. Defaults to 0.",
            "format": "int32"
          },
          "onError": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/OnErrorBehavior"
              },
              {
                "type": "null"
              }
            ],
            "description": "Error handling behaviour. Defaults to \u0060ignore\u0060."
          },
          "reportFormat": {
            "enum": [
              "json",
              "html",
              "junit"
            ],
            "type": [
              "null",
              "string"
            ],
            "description": "Include the report inline in the response in this format. Omit it to get no report."
          },
          "threads": {
            "type": [
              "null",
              "integer"
            ],
            "description": "Parallel threads for performance mode, between 1 and 50. Defaults to 1,\nwhich runs the cases in order and carries variables between them.\n",
            "format": "int32"
          },
          "authOverrideJson": {
            "type": [
              "null",
              "string"
            ],
            "description": "Authentication configuration that replaces the one stored on the suite,\nwhich lets a pipeline inject its own credentials.\n"
          }
        },
        "description": "Everything a pipeline needs to start one suite run."
      },
      "CliRunResponse": {
        "required": [
          "allPassed",
          "totalElapsedMs",
          "totalTests",
          "passedTests",
          "failedTests",
          "iterations"
        ],
        "type": "object",
        "properties": {
          "allPassed": {
            "type": "boolean",
            "description": "Whether every test case passed across every iteration. Gate your build on this."
          },
          "totalElapsedMs": {
            "type": "integer",
            "description": "Total run time in milliseconds.",
            "format": "int64"
          },
          "totalTests": {
            "type": "integer",
            "description": "Number of test case executions.",
            "format": "int32"
          },
          "passedTests": {
            "type": "integer",
            "description": "Number that passed.",
            "format": "int32"
          },
          "failedTests": {
            "type": "integer",
            "description": "Number that failed or errored.",
            "format": "int32"
          },
          "testRunId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Public id of the stored test run, which the report endpoints take.",
            "format": "uuid"
          },
          "iterations": {
            "type": "integer",
            "description": "Number of iterations executed.",
            "format": "int32"
          },
          "iterationResults": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/IterationResult"
            },
            "description": "Per-iteration breakdown, present only when more than one iteration ran."
          },
          "report": {
            "type": [
              "null",
              "string"
            ],
            "description": "The report content, present only when \u0060reportFormat\u0060 was requested."
          },
          "reportFormat": {
            "type": [
              "null",
              "string"
            ],
            "description": "Format of the inline report."
          },
          "reportContentType": {
            "type": [
              "null",
              "string"
            ],
            "description": "MIME type of the inline report."
          }
        },
        "description": "The verdict of a suite run, shaped for a CI step. Branch your build on allPassed."
      },
      "CliRunStatus": {
        "required": [
          "id",
          "status",
          "completedCases",
          "totalCases",
          "passedCases",
          "failedCases",
          "currentDurationMs",
          "startedAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the test run.",
            "format": "uuid"
          },
          "status": {
            "enum": [
              "pending",
              "running",
              "passed",
              "failed",
              "error",
              "cancelled"
            ],
            "type": "string",
            "description": "Current state of the run."
          },
          "completedCases": {
            "type": "integer",
            "description": "Test cases finished so far.",
            "format": "int32"
          },
          "totalCases": {
            "type": "integer",
            "description": "Test cases in the run.",
            "format": "int32"
          },
          "passedCases": {
            "type": "integer",
            "description": "Test cases that passed.",
            "format": "int32"
          },
          "failedCases": {
            "type": "integer",
            "description": "Test cases that failed.",
            "format": "int32"
          },
          "currentDurationMs": {
            "type": "integer",
            "description": "Elapsed time, which counts up while the run is going and is final once it ends.",
            "format": "int64"
          },
          "startedAt": {
            "type": "string",
            "description": "When the run started.",
            "format": "date-time"
          },
          "completedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the run ended, or null while it is still going.",
            "format": "date-time"
          }
        },
        "description": "How far a running suite has come, for progress output while a run is in flight."
      },
      "ExecuteTestSuiteRequest": {
        "type": "object",
        "properties": {
          "environmentId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Environment whose variables the run substitutes.",
            "format": "uuid"
          },
          "persistResults": {
            "type": [
              "null",
              "boolean"
            ],
            "description": "Whether to store the run and its results. Defaults to true."
          },
          "iterations": {
            "type": [
              "null",
              "integer"
            ],
            "description": "How often to run the suite, between 1 and 10000. Defaults to 1.",
            "format": "int32"
          },
          "delayMs": {
            "type": [
              "null",
              "integer"
            ],
            "description": "Pause between iterations in milliseconds, up to 60000. Defaults to 0.",
            "format": "int32"
          },
          "onError": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/OnErrorBehavior"
              },
              {
                "type": "null"
              }
            ],
            "description": "Error handling behaviour. Defaults to \u0060ignore\u0060."
          },
          "dataSetId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Data set for data-driven execution, which runs every case once per row.",
            "format": "uuid"
          },
          "threads": {
            "type": [
              "null",
              "integer"
            ],
            "description": "Parallel threads for performance mode, between 1 and 50. Defaults to 1.",
            "format": "int32"
          },
          "progressRunId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Client-generated id for live progress. Join the test-runner hub group for\nthis id before sending the request, then follow the run case by case.\n",
            "format": "uuid"
          },
          "caseIds": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Run only these test cases. Null or empty runs the whole suite."
          }
        },
        "description": "Options for a suite run. Every field has a default, so the body may be omitted entirely."
      },
      "TestSuiteExecutionResult": {
        "required": [
          "results",
          "extractedVariables",
          "allPassed",
          "totalElapsedMs",
          "iterations",
          "threads"
        ],
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TestCaseExecutionResult"
            },
            "description": "One entry per test case execution, in run order."
          },
          "extractedVariables": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Variables extracted during the run and carried between cases."
          },
          "allPassed": {
            "type": "boolean",
            "description": "Whether every case passed."
          },
          "totalElapsedMs": {
            "type": "integer",
            "description": "Total run time in milliseconds.",
            "format": "int64"
          },
          "testRunPublicId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Public id of the stored run, or null when results were not persisted.",
            "format": "uuid"
          },
          "iterations": {
            "type": "integer",
            "description": "Number of iterations executed.",
            "format": "int32"
          },
          "iterationResults": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/IterationResult"
            },
            "description": "Per-iteration breakdown, present only when more than one iteration ran."
          },
          "dataSetName": {
            "type": [
              "null",
              "string"
            ],
            "description": "Name of the data set, for a data-driven run."
          },
          "dataRowCount": {
            "type": [
              "null",
              "integer"
            ],
            "description": "Number of data rows used.",
            "format": "int32"
          },
          "threads": {
            "type": "integer",
            "description": "Threads the run used.",
            "format": "int32"
          },
          "performanceMetrics": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PerformanceMetrics"
              },
              {
                "type": "null"
              }
            ],
            "description": "Timing distribution, present when the run used more than one thread or iteration."
          },
          "preRunSeedResult": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SeedExecutionResult"
              },
              {
                "type": "null"
              }
            ],
            "description": "Result of the seed that ran before the suite."
          },
          "postRunSeedResult": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SeedExecutionResult"
              },
              {
                "type": "null"
              }
            ],
            "description": "Result of the seed that ran after the suite."
          },
          "resetSnapshotResult": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SnapshotRestoreResult"
              },
              {
                "type": "null"
              }
            ],
            "description": "Result of the snapshot restore that ran before the suite."
          }
        },
        "description": "The full result of a suite run, including per-case detail, seeds and performance figures."
      },
      "IterationResult": {
        "required": [
          "iterationNumber",
          "results",
          "allPassed",
          "elapsedMs",
          "wasAborted"
        ],
        "type": "object",
        "properties": {
          "iterationNumber": {
            "type": "integer",
            "description": "The 1-based iteration number.",
            "format": "int32"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TestCaseExecutionResult"
            },
            "description": "The result of every test case in this iteration, in run order."
          },
          "allPassed": {
            "type": "boolean",
            "description": "Whether every case passed in this iteration."
          },
          "elapsedMs": {
            "type": "integer",
            "description": "Duration of this iteration.",
            "format": "int64"
          },
          "wasAborted": {
            "type": "boolean",
            "description": "Whether the iteration stopped early because of the error behaviour."
          },
          "dataRowIndex": {
            "type": [
              "null",
              "integer"
            ],
            "description": "The 0-based data row, for a data-driven run.",
            "format": "int32"
          },
          "dataRowValues": {
            "type": [
              "null",
              "object"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "The data row values used, for a data-driven run."
          }
        },
        "description": "One pass over the suite, for runs configured with more than one iteration or a data set."
      },
      "TestCaseExecutionResult": {
        "required": [
          "statusCode",
          "headers",
          "elapsedMilliseconds",
          "resolvedUrl",
          "resolvedMethod",
          "isPending",
          "isBlocked"
        ],
        "type": "object",
        "properties": {
          "statusCode": {
            "type": "integer",
            "description": "Status code from the target server, or 0 when the request never went out.",
            "format": "int32"
          },
          "statusText": {
            "type": [
              "null",
              "string"
            ],
            "description": "Reason phrase from the target server."
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Response headers from the target server."
          },
          "body": {
            "type": [
              "null",
              "string"
            ],
            "description": "Response body, which may be null for an empty response."
          },
          "elapsedMilliseconds": {
            "type": "integer",
            "description": "Request duration in milliseconds.",
            "format": "int64"
          },
          "error": {
            "type": [
              "null",
              "string"
            ],
            "description": "Set when the request itself failed, for example on a timeout."
          },
          "resolvedUrl": {
            "type": "string",
            "description": "The URL after variable substitution."
          },
          "resolvedMethod": {
            "type": "string",
            "description": "The HTTP method used."
          },
          "unresolvedVariables": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            },
            "description": "Variables that could not be resolved, which is usually a missing environment value."
          },
          "passed": {
            "type": [
              "null",
              "boolean"
            ],
            "description": "Whether every assertion held. Null when the case has no assertions or never ran."
          },
          "assertionResults": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/AssertionResult"
            },
            "description": "One entry per assertion on the case. Null when the case carries none or never ran."
          },
          "testCaseId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Public id of the test case.",
            "format": "uuid"
          },
          "testCaseName": {
            "type": [
              "null",
              "string"
            ],
            "description": "Name of the test case."
          },
          "extractedVariables": {
            "type": [
              "null",
              "object"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Variables this response contributed to later cases."
          },
          "consumedVariables": {
            "type": [
              "null",
              "object"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Variables this case read."
          },
          "resolvedHeaders": {
            "type": [
              "null",
              "object"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Request headers after variable substitution."
          },
          "resolvedBody": {
            "type": [
              "null",
              "string"
            ],
            "description": "Request body after variable substitution."
          },
          "responseSizeBytes": {
            "type": [
              "null",
              "integer"
            ],
            "description": "Size of the response body.",
            "format": "int64"
          },
          "preRequestScriptOutput": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            },
            "description": "Console output of the pre-request script."
          },
          "preRequestScriptError": {
            "type": [
              "null",
              "string"
            ],
            "description": "Set when the pre-request script failed."
          },
          "postResponseScriptOutput": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            },
            "description": "Console output of the post-response script."
          },
          "postResponseScriptError": {
            "type": [
              "null",
              "string"
            ],
            "description": "Set when the post-response script failed."
          },
          "timingBreakdown": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/TimingBreakdown"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the time went inside the request."
          },
          "isPending": {
            "type": "boolean",
            "description": "The case has not run yet."
          },
          "isBlocked": {
            "type": "boolean",
            "description": "The case was never sent, because it writes and the environment is read-only.\nThis is neither a pass nor a failure, so do not fail a build on it alone.\n"
          }
        },
        "description": "What happened to one test case: the response it got, the assertions it checked, and the variables it passed on."
      },
      "AssertionResult": {
        "required": [
          "assertionId",
          "type",
          "operator",
          "passed"
        ],
        "type": "object",
        "properties": {
          "assertionId": {
            "type": "string",
            "description": "Public id of the assertion, stable across runs.",
            "format": "uuid"
          },
          "type": {
            "type": "string",
            "description": "What the assertion checks, for example the status code or a JSON path."
          },
          "operator": {
            "type": "string",
            "description": "How expected and actual are compared."
          },
          "target": {
            "type": [
              "null",
              "string"
            ],
            "description": "What the assertion points at, for example a JSON path."
          },
          "expectedValue": {
            "type": [
              "null",
              "string"
            ],
            "description": "The value the assertion demanded, rendered as text."
          },
          "actualValue": {
            "type": [
              "null",
              "string"
            ],
            "description": "The value the response actually carried, rendered as text."
          },
          "passed": {
            "type": "boolean",
            "description": "Whether this single assertion held."
          },
          "errorMessage": {
            "type": [
              "null",
              "string"
            ],
            "description": "Why the assertion failed."
          },
          "checkedVersionNumber": {
            "type": [
              "null",
              "string"
            ],
            "description": "Specification version the contract assertion checked against."
          },
          "checkedVersionSource": {
            "type": [
              "null",
              "string"
            ],
            "description": "Where that version came from."
          },
          "driftedFromVersionNumber": {
            "type": [
              "null",
              "string"
            ],
            "description": "Set when the response no longer matches the version it used to."
          }
        },
        "description": "The outcome of one assertion, with expected and actual side by side."
      },
      "TimingBreakdown": {
        "required": [
          "dnsMs",
          "connectMs",
          "tlsMs",
          "firstByteMs",
          "downloadMs",
          "totalMs"
        ],
        "type": "object",
        "properties": {
          "dnsMs": {
            "type": "integer",
            "description": "Time spent resolving the hostname. Zero on a reused connection.",
            "format": "int64"
          },
          "connectMs": {
            "type": "integer",
            "description": "Time spent opening the TCP connection.",
            "format": "int64"
          },
          "tlsMs": {
            "type": "integer",
            "description": "Time spent on the TLS handshake.",
            "format": "int64"
          },
          "firstByteMs": {
            "type": "integer",
            "description": "Time from request sent to the first response byte, which is where server work shows up.",
            "format": "int64"
          },
          "downloadMs": {
            "type": "integer",
            "description": "Time spent reading the response body.",
            "format": "int64"
          },
          "totalMs": {
            "type": "integer",
            "description": "Total wall time of the request. It covers the phases above plus scheduling overhead.",
            "format": "int64"
          }
        },
        "description": "Where the time inside one request went, from name resolution to the last byte."
      },
      "PerformanceMetrics": {
        "type": "object",
        "properties": {
          "averageResponseTimeMs": {
            "type": "number",
            "description": "Mean response time across every request in the run.",
            "format": "double"
          },
          "minResponseTimeMs": {
            "type": "integer",
            "description": "Fastest single response in the run.",
            "format": "int64"
          },
          "maxResponseTimeMs": {
            "type": "integer",
            "description": "Slowest single response in the run, which is the number a timeout budget has to beat.",
            "format": "int64"
          },
          "medianResponseTimeMs": {
            "type": "integer",
            "description": "Median response time, less distorted by outliers than the mean.",
            "format": "int64"
          },
          "p95ResponseTimeMs": {
            "type": "integer",
            "description": "95th percentile, so one request in twenty was slower than this.",
            "format": "int64"
          },
          "p99ResponseTimeMs": {
            "type": "integer",
            "description": "99th percentile, the usual number behind a latency commitment.",
            "format": "int64"
          },
          "throughputPerSecond": {
            "type": "number",
            "description": "Completed requests per second across the run.",
            "format": "double"
          },
          "errorRatePercent": {
            "type": "number",
            "description": "Share of requests that failed, from 0 to 100.",
            "format": "double"
          },
          "totalRequests": {
            "type": "integer",
            "description": "Requests sent across all threads and iterations.",
            "format": "int32"
          },
          "successfulRequests": {
            "type": "integer",
            "description": "Requests that completed and passed their assertions.",
            "format": "int32"
          },
          "failedRequests": {
            "type": "integer",
            "description": "Requests that errored or failed an assertion.",
            "format": "int32"
          },
          "perTestCase": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TestCasePerformance"
            },
            "description": "The same figures broken down per test case, which is how you find the one slow call."
          }
        },
        "description": "Latency distribution and throughput of a run. Present once a run used parallel threads or several iterations."
      },
      "TestCasePerformance": {
        "type": "object",
        "properties": {
          "testCaseId": {
            "type": "string",
            "description": "Public id of the test case these figures belong to.",
            "format": "uuid"
          },
          "testCaseName": {
            "type": "string",
            "description": "Display name of the test case."
          },
          "averageResponseTimeMs": {
            "type": "number",
            "description": "Mean response time of this case across all its executions.",
            "format": "double"
          },
          "minResponseTimeMs": {
            "type": "integer",
            "description": "Fastest execution of this case.",
            "format": "int64"
          },
          "maxResponseTimeMs": {
            "type": "integer",
            "description": "Slowest execution of this case.",
            "format": "int64"
          },
          "p95ResponseTimeMs": {
            "type": "integer",
            "description": "95th percentile response time of this case.",
            "format": "int64"
          },
          "errorRatePercent": {
            "type": "number",
            "description": "Share of this case executions that failed, from 0 to 100.",
            "format": "double"
          },
          "requestCount": {
            "type": "integer",
            "description": "How often this case ran, which is iterations multiplied by threads.",
            "format": "int32"
          }
        },
        "description": "Latency figures for a single test case across all its executions."
      },
      "SeedExecutionResult": {
        "required": [
          "success",
          "elapsedMilliseconds",
          "stepResults",
          "capturedVariables"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether every step of the seed completed. A failed seed does not stop the suite by itself."
          },
          "elapsedMilliseconds": {
            "type": "integer",
            "description": "Duration of the whole seed sequence.",
            "format": "int64"
          },
          "stepResults": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SeedStepResult"
            },
            "description": "One entry per seed step, in execution order."
          },
          "capturedVariables": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Variables the seed captured for the suite that follows."
          },
          "error": {
            "type": [
              "null",
              "string"
            ],
            "description": "Why the seed failed. Null on success."
          }
        },
        "description": "The outcome of a seed sequence, which prepares data before a suite or cleans up after it."
      },
      "SeedStepResult": {
        "type": "object",
        "properties": {
          "order": {
            "type": "integer",
            "description": "Position of the step in the sequence, starting at 1.",
            "format": "int32"
          },
          "type": {
            "type": "string",
            "description": "What the step does."
          },
          "success": {
            "type": "boolean",
            "description": "Whether this step completed."
          },
          "elapsedMilliseconds": {
            "type": "integer",
            "description": "Duration of this step.",
            "format": "int64"
          },
          "statusCode": {
            "type": [
              "null",
              "integer"
            ],
            "description": "HTTP status the step received. Null for steps that send no request.",
            "format": "int32"
          },
          "error": {
            "type": [
              "null",
              "string"
            ],
            "description": "Why the step failed. Null on success."
          },
          "resolvedUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "The URL after variable substitution."
          },
          "resolvedMethod": {
            "type": [
              "null",
              "string"
            ],
            "description": "The HTTP method the step used."
          },
          "iterationIndex": {
            "type": [
              "null",
              "integer"
            ],
            "description": "Which repetition this is, for a step configured to loop.",
            "format": "int32"
          },
          "capturedVariables": {
            "type": [
              "null",
              "object"
            ],
            "additionalProperties": {
              "type": "string"
            },
            "description": "Variables this step captured for the steps and cases that follow."
          }
        },
        "description": "One step inside a seed sequence."
      },
      "SnapshotRestoreResult": {
        "required": [
          "success",
          "phase",
          "elapsedMilliseconds",
          "cleanupResults",
          "warnings"
        ],
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the environment was restored to the snapshot state."
          },
          "phase": {
            "type": "string",
            "description": "Which phase the restore reached."
          },
          "elapsedMilliseconds": {
            "type": "integer",
            "description": "Duration of the whole restore.",
            "format": "int64"
          },
          "cleanupResults": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SnapshotCleanupStepResult"
            },
            "description": "One entry per cleanup call, in execution order."
          },
          "reSeedResult": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SeedExecutionResult"
              },
              {
                "type": "null"
              }
            ],
            "description": "Result of the seed that repopulated the environment after cleanup. Null when none ran."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Non-fatal problems, such as a cleanup call that found nothing to delete."
          },
          "error": {
            "type": [
              "null",
              "string"
            ],
            "description": "Why the restore failed. Null on success."
          }
        },
        "description": "The outcome of restoring an environment to a known state before a run."
      },
      "SnapshotCleanupStepResult": {
        "type": "object",
        "properties": {
          "order": {
            "type": "integer",
            "description": "Position of the cleanup call in the sequence, starting at 1.",
            "format": "int32"
          },
          "method": {
            "type": "string",
            "description": "HTTP method of the cleanup call, usually DELETE."
          },
          "url": {
            "type": "string",
            "description": "The URL the cleanup call went to."
          },
          "success": {
            "type": "boolean",
            "description": "Whether the cleanup call succeeded."
          },
          "statusCode": {
            "type": [
              "null",
              "integer"
            ],
            "description": "HTTP status the cleanup call received.",
            "format": "int32"
          },
          "error": {
            "type": [
              "null",
              "string"
            ],
            "description": "Why the cleanup call failed. Null on success."
          },
          "elapsedMilliseconds": {
            "type": "integer",
            "description": "Duration of the cleanup call.",
            "format": "int64"
          }
        },
        "description": "One cleanup call inside a snapshot restore."
      },
      "TestSuiteList": {
        "required": [
          "items",
          "totalCount"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TestSuite"
            },
            "description": "The test suites on this page."
          },
          "totalCount": {
            "type": "integer",
            "description": "Total number of suites, ignoring paging.",
            "format": "int32"
          }
        },
        "description": "A page of test suites."
      },
      "TestSuite": {
        "required": [
          "id",
          "name",
          "testCaseCount",
          "authMode",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the test suite.",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "description": "Display name of the suite, which is what the CLI resolves when you pass a name."
          },
          "description": {
            "type": [
              "null",
              "string"
            ],
            "description": "Free-text note on the suite. Null when none was set."
          },
          "tags": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            },
            "description": "Labels used to group and filter suites."
          },
          "testCaseCount": {
            "type": "integer",
            "description": "How many test cases the suite holds.",
            "format": "int32"
          },
          "authMode": {
            "type": "string",
            "description": "How the suite authenticates against the target API."
          },
          "authType": {
            "type": [
              "null",
              "string"
            ],
            "description": "The concrete scheme when the suite carries its own credentials, for example bearer or basic."
          },
          "createdAt": {
            "type": "string",
            "description": "When the suite was created, in UTC.",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the suite was last changed, in UTC. Null when it was never edited.",
            "format": "date-time"
          },
          "fixtureScopeJson": {
            "type": [
              "null",
              "string"
            ],
            "description": "Fixture scope of the suite, as JSON."
          },
          "testSuiteFolderId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Folder the suite sits in, or null at the root.",
            "format": "uuid"
          }
        },
        "description": "A test suite as it appears in a list, without its cases."
      },
      "Environment": {
        "required": [
          "id",
          "name",
          "type",
          "createdAt",
          "variableCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the environment.",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "description": "Display name of the environment, such as Staging."
          },
          "type": {
            "description": "Which stage the environment stands for.",
            "$ref": "#/components/schemas/EnvironmentType"
          },
          "baseUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "Base URL requests in this environment are sent to."
          },
          "createdAt": {
            "type": "string",
            "description": "When the environment was created, in UTC.",
            "format": "date-time"
          },
          "variableCount": {
            "type": "integer",
            "description": "How many variables the environment defines for substitution.",
            "format": "int32"
          },
          "freezesVersion": {
            "type": "boolean",
            "description": "A promotion into this environment makes the promoted version immutable."
          },
          "isDocsSource": {
            "type": "boolean",
            "description": "What this environment pins is what the public documentation shows."
          },
          "isMockSource": {
            "type": "boolean",
            "description": "What this environment pins is what the mock server serves."
          },
          "isReadOnly": {
            "type": "boolean",
            "description": "Only GET, HEAD and OPTIONS may be sent here. Test cases that write are\nreported as blocked rather than run.\n"
          }
        },
        "description": "A target environment with its base URL, its variables and the roles it plays for docs, mocks and version pinning."
      },
      "ApiSpecList": {
        "required": [
          "items",
          "totalCount"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiSpec"
            },
            "description": "The specifications on this page."
          },
          "totalCount": {
            "type": "integer",
            "description": "Total number of specifications in the project, ignoring paging.",
            "format": "int32"
          }
        },
        "description": "A page of API specifications."
      },
      "ApiSpec": {
        "required": [
          "id",
          "name",
          "version",
          "openApiVersion",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the specification.",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "description": "Display name of the specification, which is what the CLI resolves when you pass a name."
          },
          "version": {
            "type": "string",
            "description": "The version string carried in the document itself."
          },
          "openApiVersion": {
            "description": "Which OpenAPI dialect the document is written in.",
            "$ref": "#/components/schemas/OpenApiVersion"
          },
          "description": {
            "type": [
              "null",
              "string"
            ],
            "description": "Free-text note on the specification. Null when none was set."
          },
          "basePath": {
            "type": [
              "null",
              "string"
            ],
            "description": "Path prefix shared by every endpoint, when the specification defines one."
          },
          "createdAt": {
            "type": "string",
            "description": "When the specification was created, in UTC.",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the specification was last changed, in UTC. Null when it was never edited.",
            "format": "date-time"
          },
          "rowVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "Base64 concurrency token. Send it back on an update to catch a competing edit."
          },
          "latestPublishedVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "Number of the most recent published version, or null when none is published yet."
          }
        },
        "description": "An API specification in a project, with the number of its latest published version."
      },
      "SpecVersionList": {
        "required": [
          "items",
          "totalCount"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpecVersion"
            },
            "description": "The versions on this page."
          },
          "totalCount": {
            "type": "integer",
            "description": "Total number of versions of this specification, ignoring paging.",
            "format": "int32"
          }
        },
        "description": "A page of specification versions."
      },
      "SpecVersion": {
        "required": [
          "id",
          "versionNumber",
          "status",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the version.",
            "format": "uuid"
          },
          "versionNumber": {
            "type": "string",
            "description": "The version label, for example 1.2.0. It follows the numbering scheme of the organization."
          },
          "status": {
            "description": "Where the version stands in its lifecycle.",
            "$ref": "#/components/schemas/VersionStatus"
          },
          "createdAt": {
            "type": "string",
            "description": "When the version was created, in UTC.",
            "format": "date-time"
          },
          "publishedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the version was published, in UTC. Null while it is still a draft or in review.",
            "format": "date-time"
          },
          "publishTarget": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PublishTarget"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who the version is visible to. Null until it is published."
          },
          "rowVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "Base64 concurrency token."
          }
        },
        "description": "One version of a specification. Only a published version is frozen."
      },
      "PromoteVersionRequest": {
        "required": [
          "environmentId"
        ],
        "type": "object",
        "properties": {
          "environmentId": {
            "type": "string",
            "description": "Environment the version was deployed to.",
            "format": "uuid"
          },
          "publishTarget": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PublishTarget"
              },
              {
                "type": "null"
              }
            ],
            "description": "Who the version becomes visible to. Defaults to \u0060internal\u0060."
          },
          "impactAcknowledged": {
            "type": [
              "null",
              "boolean"
            ],
            "description": "Confirms you have seen the effect on dependent services. Send true to clear\na promotion that was refused with 409 for that reason.\n"
          }
        },
        "description": "Which environment a version was deployed to, and what that should make it visible to."
      },
      "PromotionResult": {
        "required": [
          "promotionId",
          "environmentId",
          "environmentName",
          "versionId",
          "versionNumber",
          "frozeVersion",
          "source",
          "isRollback"
        ],
        "type": "object",
        "properties": {
          "promotionId": {
            "type": "string",
            "description": "Public id of this promotion record, which the audit trail refers to.",
            "format": "uuid"
          },
          "environmentId": {
            "type": "string",
            "description": "Public id of the environment the version went into.",
            "format": "uuid"
          },
          "environmentName": {
            "type": "string",
            "description": "Display name of that environment."
          },
          "versionId": {
            "type": "string",
            "description": "Public id of the promoted version.",
            "format": "uuid"
          },
          "versionNumber": {
            "type": "string",
            "description": "Version label of the promoted version."
          },
          "frozeVersion": {
            "type": "boolean",
            "description": "Whether this promotion made the version immutable."
          },
          "previousVersionNumber": {
            "type": [
              "null",
              "string"
            ],
            "description": "What the environment pinned before, or null if this is the first promotion."
          },
          "source": {
            "description": "How the pin was set. A call with an API key is recorded as cli.",
            "$ref": "#/components/schemas/PinSource"
          },
          "isRollback": {
            "type": "boolean",
            "description": "Whether the pin moved back to a version the environment served earlier."
          }
        },
        "description": "What the promotion changed: the new pin, whether it froze the version, and where the pin came from."
      },
      "ScanRun": {
        "required": [
          "id",
          "scanProfilePublicId",
          "status",
          "trigger",
          "startedAt",
          "totalChecks",
          "checksPassed",
          "checksFailed",
          "checksSkipped",
          "securityScore",
          "openFindingsCount"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the scan run.",
            "format": "uuid"
          },
          "scanProfilePublicId": {
            "type": "string",
            "description": "Profile the run was started from.",
            "format": "uuid"
          },
          "status": {
            "description": "Where the run stands. Poll until it leaves queued and running.",
            "$ref": "#/components/schemas/ScanStatus"
          },
          "trigger": {
            "description": "What started the run.",
            "$ref": "#/components/schemas/ScanTrigger"
          },
          "startedAt": {
            "type": "string",
            "description": "When the run was queued, in UTC.",
            "format": "date-time"
          },
          "completedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the run finished, in UTC. Null while it is still going.",
            "format": "date-time"
          },
          "totalChecks": {
            "type": "integer",
            "description": "How many individual checks the enabled scanners performed.",
            "format": "int32"
          },
          "checksPassed": {
            "type": "integer",
            "description": "Checks that found nothing.",
            "format": "int32"
          },
          "checksFailed": {
            "type": "integer",
            "description": "Checks that produced a finding.",
            "format": "int32"
          },
          "checksSkipped": {
            "type": "integer",
            "description": "Checks that could not run, for example because an endpoint needs authentication the profile does not carry.",
            "format": "int32"
          },
          "securityScore": {
            "type": "integer",
            "description": "Score between 0 and 100, final once the status is \u0060completed\u0060.",
            "format": "int32"
          },
          "errorMessage": {
            "type": [
              "null",
              "string"
            ],
            "description": "Set when the run failed."
          },
          "openFindingsCount": {
            "type": "integer",
            "description": "Findings still open after this run.",
            "format": "int32"
          },
          "enabledScannerCount": {
            "type": "integer",
            "description": "Scanners the profile enables.",
            "format": "int32"
          },
          "scannersCompleted": {
            "type": "integer",
            "description": "Scanners finished so far.",
            "format": "int32"
          },
          "currentScannerId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Scanner running right now."
          },
          "cancelRequestedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "Set when a cancel was asked for but the run has not stopped yet.",
            "format": "date-time"
          }
        },
        "description": "A security scan, from queued through running to its final score and finding count."
      },
      "SecurityFindingList": {
        "required": [
          "items",
          "total",
          "skip",
          "take"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SecurityFinding"
            },
            "description": "The findings on this page."
          },
          "total": {
            "type": "integer",
            "description": "Total number of matching findings, ignoring paging.",
            "format": "int32"
          },
          "skip": {
            "type": "integer",
            "description": "How many findings were skipped to reach this page.",
            "format": "int32"
          },
          "take": {
            "type": "integer",
            "description": "Page size that was applied.",
            "format": "int32"
          }
        },
        "description": "A page of security findings."
      },
      "SecurityFinding": {
        "required": [
          "id",
          "scanRunPublicId",
          "firstSeenScanRunPublicId",
          "scannerId",
          "owaspCategory",
          "severity",
          "confidence",
          "status",
          "title",
          "description",
          "guidanceId",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the finding.",
            "format": "uuid"
          },
          "scanRunPublicId": {
            "type": "string",
            "description": "Run that reported it most recently.",
            "format": "uuid"
          },
          "firstSeenScanRunPublicId": {
            "type": "string",
            "description": "Run that reported it first. When this differs from \u0060scanRunPublicId\u0060, the\nfinding has survived at least one further scan.\n",
            "format": "uuid"
          },
          "scannerId": {
            "type": "string",
            "description": "Scanner that produced the finding."
          },
          "owaspCategory": {
            "type": "string",
            "description": "OWASP API Security category, for example \u0060API1\u0060."
          },
          "severity": {
            "description": "How serious the finding is.",
            "$ref": "#/components/schemas/Severity"
          },
          "confidence": {
            "description": "How certain the scanner is that this is real rather than a false positive.",
            "$ref": "#/components/schemas/Confidence"
          },
          "status": {
            "description": "Where the finding stands in triage.",
            "$ref": "#/components/schemas/FindingStatus"
          },
          "title": {
            "type": "string",
            "description": "One-line summary of the problem."
          },
          "description": {
            "type": "string",
            "description": "What the scanner found and why it matters."
          },
          "path": {
            "type": [
              "null",
              "string"
            ],
            "description": "Path of the affected endpoint."
          },
          "method": {
            "type": [
              "null",
              "string"
            ],
            "description": "HTTP method of the affected endpoint."
          },
          "reproductionCurl": {
            "type": [
              "null",
              "string"
            ],
            "description": "A curl command that reproduces the finding."
          },
          "guidanceId": {
            "type": "string",
            "description": "Id of the remediation guidance for this finding."
          },
          "assignedToUserId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Public id of the user who owns the finding. Null when nobody was assigned.",
            "format": "uuid"
          },
          "assignedToUserName": {
            "type": [
              "null",
              "string"
            ],
            "description": "Display name of that user."
          },
          "resolutionNotes": {
            "type": [
              "null",
              "string"
            ],
            "description": "What was done about the finding, written when it was closed."
          },
          "resolvedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the finding was closed, in UTC. Null while it is open.",
            "format": "date-time"
          },
          "resolvedByUserId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Public id of the user who closed the finding.",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "description": "When the finding was first reported, in UTC.",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the finding was last touched, in UTC.",
            "format": "date-time"
          }
        },
        "description": "One security finding, with its OWASP category, its triage state and a curl command that reproduces it."
      },
      "GetDocumentationsResult": {
        "required": [
          "documentations"
        ],
        "type": "object",
        "properties": {
          "documentations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Documentation"
            },
            "description": "The documentations of the project. A project usually has exactly one."
          }
        },
        "description": "The documentations of a project."
      },
      "Documentation": {
        "required": [
          "id",
          "customDomainVerified",
          "branding",
          "versioningScheme",
          "requireApproval",
          "portalEnabled",
          "versions"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the documentation.",
            "format": "uuid"
          },
          "customDomain": {
            "type": [
              "null",
              "string"
            ],
            "description": "Custom domain of the public portal."
          },
          "customDomainVerified": {
            "type": "boolean",
            "description": "Whether the DNS record for the custom domain has been checked and accepted."
          },
          "branding": {
            "description": "Logo, colors and footer of the public portal.",
            "$ref": "#/components/schemas/Branding"
          },
          "versioningScheme": {
            "description": "How this documentation numbers its versions.",
            "$ref": "#/components/schemas/VersionNumberingScheme"
          },
          "requireApproval": {
            "type": "boolean",
            "description": "Whether a version needs an approval before it can be published."
          },
          "portalEnabled": {
            "type": "boolean",
            "description": "Whether the public portal is switched on."
          },
          "versions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DocVersion"
            },
            "description": "Every version of this documentation, newest and oldest alike."
          },
          "rowVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "Base64 concurrency token."
          }
        },
        "description": "A documentation with its portal settings, branding and the full list of its versions."
      },
      "Branding": {
        "type": "object",
        "properties": {
          "logoUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "Logo shown in the portal header. Null falls back to the plain title."
          },
          "primaryColor": {
            "type": [
              "null",
              "string"
            ],
            "description": "Primary brand color as a CSS color value."
          },
          "accentColor": {
            "type": [
              "null",
              "string"
            ],
            "description": "Accent color used for links and highlights, as a CSS color value."
          },
          "faviconUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "Icon shown in the browser tab."
          },
          "footerText": {
            "type": [
              "null",
              "string"
            ],
            "description": "Text placed in the portal footer, for example a copyright line."
          }
        },
        "description": "Logo, colors and footer of a public documentation portal."
      },
      "DocVersion": {
        "required": [
          "id",
          "versionNumber",
          "status",
          "visibility",
          "createdAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the documentation version.",
            "format": "uuid"
          },
          "versionNumber": {
            "type": "integer",
            "description": "Sequential number of the version, counting from 1.",
            "format": "int32"
          },
          "status": {
            "description": "Where the version stands. Only draft and review accept content changes.",
            "$ref": "#/components/schemas/DocVersionStatus"
          },
          "visibility": {
            "description": "Who can read the version once it is published.",
            "$ref": "#/components/schemas/DocVisibility"
          },
          "publishedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the version was published, in UTC. Null while it is a draft.",
            "format": "date-time"
          },
          "createdAt": {
            "type": "string",
            "description": "When the version was created, in UTC.",
            "format": "date-time"
          },
          "rowVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "Base64 concurrency token."
          }
        },
        "description": "One version of a documentation. Only draft and review accept content changes."
      },
      "DocTree": {
        "required": [
          "items"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DocTreeNode"
            },
            "description": "The root level of the tree. Folders carry their children inline."
          }
        },
        "description": "The page hierarchy of a documentation version."
      },
      "DocTreeNode": {
        "required": [
          "id",
          "type",
          "sortOrder"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the tree entry itself, which is what the reorder call takes.",
            "format": "uuid"
          },
          "type": {
            "enum": [
              "page",
              "folder",
              "specSnapshot"
            ],
            "type": "string",
            "description": "Which kind of node this is."
          },
          "sortOrder": {
            "type": "integer",
            "description": "Position among its siblings.",
            "format": "int32"
          },
          "page": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DocTreePage"
              },
              {
                "type": "null"
              }
            ],
            "description": "The page payload. Filled only when type is page."
          },
          "folder": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DocTreeFolder"
              },
              {
                "type": "null"
              }
            ],
            "description": "The folder payload. Filled only when type is folder."
          },
          "specSnapshot": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DocTreeSpecSnapshot"
              },
              {
                "type": "null"
              }
            ],
            "description": "The API reference payload. Filled only when type is specSnapshot."
          }
        },
        "description": "One node of the tree. \u0060type\u0060 says which of the three payload fields is filled, and the other two are null."
      },
      "DocTreePage": {
        "required": [
          "id",
          "title",
          "slug",
          "pageType",
          "isEmpty",
          "hasEdits"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the page, which the page endpoints take.",
            "format": "uuid"
          },
          "title": {
            "type": "string",
            "description": "Page title, also used as the heading in the portal."
          },
          "slug": {
            "type": "string",
            "description": "The segment this page gets in the portal URL."
          },
          "pageType": {
            "description": "The template the page was created from.",
            "$ref": "#/components/schemas/DocPageType"
          },
          "icon": {
            "type": [
              "null",
              "string"
            ],
            "description": "Icon name shown next to the page in the sidebar."
          },
          "modifiedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "Last edit, falling back to creation. A display timestamp, in UTC.",
            "format": "date-time"
          },
          "modifiedByName": {
            "type": [
              "null",
              "string"
            ],
            "description": "Display name of whoever last edited the page."
          },
          "isEmpty": {
            "type": "boolean",
            "description": "The page has no content yet."
          },
          "hasEdits": {
            "type": "boolean",
            "description": "The page was actually edited inside this version. A freshly cloned version\nstarts with this false everywhere, which is how you tell a real change from\na carried-over page.\n"
          }
        },
        "description": "A content page inside the tree."
      },
      "DocTreeFolder": {
        "required": [
          "id",
          "name",
          "slug",
          "isSection",
          "children"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the folder, which the folder endpoints take.",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "description": "Folder name shown in the sidebar or the header."
          },
          "slug": {
            "type": "string",
            "description": "URL segment the folder contributes to the portal path."
          },
          "icon": {
            "type": [
              "null",
              "string"
            ],
            "description": "Icon name shown next to the folder."
          },
          "isSection": {
            "type": "boolean",
            "description": "The folder is a top level section in the portal header."
          },
          "description": {
            "type": [
              "null",
              "string"
            ],
            "description": "Intro text shown on the folder overview page."
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DocTreeNode"
            },
            "description": "Pages, folders and snapshots inside this folder, already in sort order."
          },
          "rowVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "Base64 concurrency token."
          }
        },
        "description": "A folder inside the tree, carrying its children inline."
      },
      "DocTreeSpecSnapshot": {
        "required": [
          "id",
          "specName",
          "versionNumber",
          "endpointCount",
          "playgroundEnabled",
          "autoSyncEnabled",
          "openApiJson",
          "sourceSpecPublicId",
          "hasNewerVersion"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the snapshot, which the snapshot endpoints take.",
            "format": "uuid"
          },
          "specName": {
            "type": "string",
            "description": "Name of the specification this snapshot was taken from."
          },
          "versionNumber": {
            "type": "string",
            "description": "Version label that was frozen into this snapshot."
          },
          "endpointCount": {
            "type": "integer",
            "description": "How many operations the frozen document holds.",
            "format": "int32"
          },
          "playgroundEnabled": {
            "type": "boolean",
            "description": "Whether the portal offers Try It on these endpoints."
          },
          "autoSyncEnabled": {
            "type": "boolean",
            "description": "Whether publishing a new specification version refreshes this snapshot on its own."
          },
          "openApiJson": {
            "type": "string",
            "description": "The frozen OpenAPI document."
          },
          "sourceSpecPublicId": {
            "type": "string",
            "description": "Public id of the specification in the API designer, so you can trace it back.",
            "format": "uuid"
          },
          "hasNewerVersion": {
            "type": "boolean",
            "description": "A newer published version exists than the one frozen here."
          },
          "latestPublishedVersionNumber": {
            "type": [
              "null",
              "string"
            ],
            "description": "Newest published version of the source specification. Compare it with versionNumber to see how far behind the snapshot is."
          },
          "endpointAnnotations": {
            "type": [
              "null",
              "string"
            ],
            "description": "Per-endpoint annotations, as JSON."
          },
          "endpointSortOrders": {
            "type": [
              "null",
              "string"
            ],
            "description": "Per-endpoint order, as JSON."
          },
          "tagSortOrders": {
            "type": [
              "null",
              "string"
            ],
            "description": "Tag order, as JSON."
          },
          "folderDescriptions": {
            "type": [
              "null",
              "string"
            ],
            "description": "Folder intro texts, as JSON."
          }
        },
        "description": "A frozen copy of a published API specification, rendered as the API reference of the portal."
      },
      "DocPageDetail": {
        "required": [
          "id",
          "title",
          "slug",
          "content",
          "pageType",
          "createdAt",
          "isLocked"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the page.",
            "format": "uuid"
          },
          "title": {
            "type": "string",
            "description": "Page title, also used as the heading in the portal."
          },
          "slug": {
            "type": "string",
            "description": "URL segment of the page in the portal path."
          },
          "content": {
            "type": "string",
            "description": "The page content as Markdown."
          },
          "pageType": {
            "description": "The template the page was created from.",
            "$ref": "#/components/schemas/DocPageType"
          },
          "structuredContent": {
            "type": [
              "null",
              "string"
            ],
            "description": "The editor representation of the content, as JSON."
          },
          "icon": {
            "type": [
              "null",
              "string"
            ],
            "description": "Icon name shown next to the page in the sidebar."
          },
          "createdAt": {
            "type": "string",
            "description": "When the page was created, in UTC.",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the page was last edited, in UTC. Null when it was never touched in this version.",
            "format": "date-time"
          },
          "rowVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "Base64 concurrency token. Send it back on the next update."
          },
          "isLocked": {
            "type": "boolean",
            "description": "Someone holds the page open in the editor, so it cannot be written."
          }
        },
        "description": "A single page with its Markdown content and its concurrency token."
      },
      "CreateDocPageRequest": {
        "required": [
          "title"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "Page title. It becomes the heading and, unless you send a slug, the URL segment."
          },
          "content": {
            "type": [
              "null",
              "string"
            ],
            "description": "Page content as Markdown."
          },
          "parentFolderPublicId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Folder to create the page in, or null for the root.",
            "format": "uuid"
          },
          "pageType": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DocPageType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Template of the page. Defaults to \u0060custom\u0060."
          },
          "structuredContent": {
            "type": [
              "null",
              "string"
            ],
            "description": "The editor representation of the content as JSON. Send content instead unless you are mirroring the editor."
          },
          "icon": {
            "type": [
              "null",
              "string"
            ],
            "description": "Icon name to show next to the page in the sidebar."
          },
          "slug": {
            "type": [
              "null",
              "string"
            ],
            "description": "URL segment of the page. Derived from the title when you leave it out."
          }
        },
        "description": "A new page. Only the title is required."
      },
      "UpdateDocPageRequest": {
        "required": [
          "title",
          "content"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "New page title. Sending the old one leaves it unchanged."
          },
          "content": {
            "type": "string",
            "description": "Page content as Markdown."
          },
          "structuredContent": {
            "type": [
              "null",
              "string"
            ],
            "description": "The editor representation of the content as JSON. Send content instead unless you are mirroring the editor."
          },
          "icon": {
            "type": [
              "null",
              "string"
            ],
            "description": "Icon name to show next to the page in the sidebar."
          },
          "expectedRowVersion": {
            "type": [
              "null",
              "string"
            ],
            "description": "The \u0060rowVersion\u0060 you read. When it no longer matches, the call is rejected\nwith 409 instead of overwriting a competing edit.\n",
            "format": "byte"
          },
          "slug": {
            "type": [
              "null",
              "string"
            ],
            "description": "New URL segment. The old one keeps redirecting."
          }
        },
        "description": "The new title and content of a page. Both replace what is there."
      },
      "CreateDocPageResult": {
        "required": [
          "id",
          "slug"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the new page.",
            "format": "uuid"
          },
          "slug": {
            "type": "string",
            "description": "URL segment the page received, derived from the title unless you sent one."
          }
        },
        "description": "The id and slug the new page received."
      },
      "CreateDocFolderRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Folder name. It becomes the sidebar label and, unless you send a slug, the URL segment."
          },
          "icon": {
            "type": [
              "null",
              "string"
            ],
            "description": "Icon name to show next to the folder."
          },
          "description": {
            "type": [
              "null",
              "string"
            ],
            "description": "Intro text shown on the folder overview."
          },
          "parentFolderPublicId": {
            "type": [
              "null",
              "string"
            ],
            "description": "Folder to nest inside, or null for the root.",
            "format": "uuid"
          },
          "isSection": {
            "type": "boolean",
            "description": "Make this a top level section in the portal header instead of a sidebar\nentry. Only a folder at the root can be one.\n",
            "default": false
          },
          "slug": {
            "type": [
              "null",
              "string"
            ],
            "description": "URL segment. Derived from the name when you leave it out."
          }
        },
        "description": "A new folder. Only the name is required."
      },
      "CreateDocFolderResult": {
        "required": [
          "id",
          "slug"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public id of the new folder, which you pass as parentFolderPublicId to fill it.",
            "format": "uuid"
          },
          "slug": {
            "type": "string",
            "description": "URL segment the folder received, derived from the name unless you sent one."
          }
        },
        "description": "The id and slug the new folder received."
      },
      "ReorderTreeItemsRequest": {
        "required": [
          "itemPublicIds"
        ],
        "type": "object",
        "properties": {
          "parentFolderPublicId": {
            "type": [
              "null",
              "string"
            ],
            "description": "The folder whose children you are ordering, or null for the root.",
            "format": "uuid"
          },
          "itemPublicIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Every id under that parent, in the order you want them."
          }
        },
        "description": "The complete, ordered list of ids under one parent. Position is the index in that list."
      },
      "ScimUserResource": {
        "required": [
          "schemas",
          "id",
          "userName",
          "emails",
          "active",
          "meta"
        ],
        "type": "object",
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Always contains \u0060urn:ietf:params:scim:schemas:core:2.0:User\u0060."
          },
          "id": {
            "type": "string",
            "description": "SCIM id of the user."
          },
          "externalId": {
            "type": [
              "null",
              "string"
            ],
            "description": "The identifier the identity provider uses."
          },
          "userName": {
            "type": "string",
            "description": "The login name, which is the email address."
          },
          "name": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ScimName"
              },
              {
                "type": "null"
              }
            ],
            "description": "Structured name parts. Identity providers usually send given and family name."
          },
          "emails": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScimEmail"
            },
            "description": "Email addresses of the user. Exactly one carries primary."
          },
          "active": {
            "type": "boolean",
            "description": "Setting this to false deactivates the user without deleting the record."
          },
          "meta": {
            "description": "Resource metadata written by Routebase, not by the identity provider.",
            "$ref": "#/components/schemas/ScimMeta"
          }
        },
        "description": "A SCIM 2.0 user, as identity providers create and update it."
      },
      "ScimName": {
        "type": "object",
        "properties": {
          "givenName": {
            "type": [
              "null",
              "string"
            ],
            "description": "First name."
          },
          "familyName": {
            "type": [
              "null",
              "string"
            ],
            "description": "Last name."
          },
          "formatted": {
            "type": [
              "null",
              "string"
            ],
            "description": "The full name as the identity provider renders it."
          }
        },
        "description": "The structured name parts of a SCIM user."
      },
      "ScimEmail": {
        "required": [
          "value",
          "primary"
        ],
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "description": "The email address."
          },
          "primary": {
            "type": "boolean",
            "description": "Whether this is the address Routebase uses to identify the user."
          },
          "type": {
            "type": [
              "null",
              "string"
            ],
            "description": "Label the identity provider attached, such as work or home."
          }
        },
        "description": "One email address of a SCIM user."
      },
      "ScimGroupResource": {
        "required": [
          "schemas",
          "id",
          "displayName",
          "members",
          "meta"
        ],
        "type": "object",
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Always contains \u0060urn:ietf:params:scim:schemas:core:2.0:Group\u0060."
          },
          "id": {
            "type": "string",
            "description": "SCIM id of the group, assigned by Routebase."
          },
          "externalId": {
            "type": [
              "null",
              "string"
            ],
            "description": "The identifier the identity provider uses for this group."
          },
          "displayName": {
            "type": "string",
            "description": "Group name, which is what a group mapping matches on."
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScimGroupMemberRef"
            },
            "description": "Users in the group. Add and remove them with a PatchOp rather than by replacing the list."
          },
          "meta": {
            "description": "Resource metadata written by Routebase, not by the identity provider.",
            "$ref": "#/components/schemas/ScimMeta"
          }
        },
        "description": "A SCIM 2.0 group with its members. Groups map onto Routebase teams."
      },
      "ScimGroupMemberRef": {
        "required": [
          "value"
        ],
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "description": "SCIM id of the member."
          },
          "display": {
            "type": [
              "null",
              "string"
            ],
            "description": "Display name of the member, for readability."
          },
          "$ref": {
            "type": [
              "null",
              "string"
            ],
            "description": "URL of the member resource."
          },
          "type": {
            "type": [
              "null",
              "string"
            ],
            "description": "Kind of member. Routebase only supports User.",
            "default": "User"
          }
        },
        "description": "A reference from a group to one of its members."
      },
      "ScimMeta": {
        "required": [
          "resourceType",
          "created",
          "lastModified",
          "location"
        ],
        "type": "object",
        "properties": {
          "resourceType": {
            "type": "string",
            "description": "Either \u0060User\u0060 or \u0060Group\u0060."
          },
          "created": {
            "type": "string",
            "description": "When Routebase created the resource, in UTC.",
            "format": "date-time"
          },
          "lastModified": {
            "type": "string",
            "description": "When the resource last changed, in UTC.",
            "format": "date-time"
          },
          "location": {
            "type": "string",
            "description": "URL of this resource."
          },
          "version": {
            "type": [
              "null",
              "string"
            ],
            "description": "Entity tag of the resource, when the provider asked for one."
          }
        },
        "description": "SCIM resource metadata, written by Routebase rather than by the identity provider."
      },
      "ScimPatchRequest": {
        "required": [
          "schemas",
          "Operations"
        ],
        "type": "object",
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Always contains \u0060urn:ietf:params:scim:api:messages:2.0:PatchOp\u0060."
          },
          "Operations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScimPatchOperation"
            },
            "description": "The operations to apply, in order. Capitalised because SCIM defines it that way."
          }
        },
        "description": "A SCIM PatchOp envelope, the usual way an identity provider changes one attribute."
      },
      "ScimPatchOperation": {
        "required": [
          "op"
        ],
        "type": "object",
        "properties": {
          "op": {
            "enum": [
              "add",
              "remove",
              "replace"
            ],
            "type": "string",
            "description": "The operation to apply."
          },
          "path": {
            "type": [
              "null",
              "string"
            ],
            "description": "Attribute path the operation targets."
          },
          "value": {
            "description": "The new value, whose shape depends on the path."
          }
        },
        "description": "One operation inside a PatchOp."
      },
      "ScimUserListResponse": {
        "required": [
          "schemas",
          "totalResults",
          "startIndex",
          "itemsPerPage",
          "Resources"
        ],
        "type": "object",
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Always contains \u0060urn:ietf:params:scim:api:messages:2.0:ListResponse\u0060."
          },
          "totalResults": {
            "type": "integer",
            "description": "Total number of matching users, ignoring paging.",
            "format": "int32"
          },
          "startIndex": {
            "type": "integer",
            "description": "1-based index of the first entry in this page.",
            "format": "int32"
          },
          "itemsPerPage": {
            "type": "integer",
            "description": "How many entries this page holds.",
            "format": "int32"
          },
          "Resources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScimUserResource"
            },
            "description": "The users on this page. Capitalised because SCIM defines it that way."
          }
        },
        "description": "A SCIM ListResponse envelope holding users."
      },
      "ScimGroupListResponse": {
        "required": [
          "schemas",
          "totalResults",
          "startIndex",
          "itemsPerPage",
          "Resources"
        ],
        "type": "object",
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Always contains \u0060urn:ietf:params:scim:api:messages:2.0:ListResponse\u0060."
          },
          "totalResults": {
            "type": "integer",
            "description": "Total number of matching groups, ignoring paging.",
            "format": "int32"
          },
          "startIndex": {
            "type": "integer",
            "description": "1-based index of the first entry in this page.",
            "format": "int32"
          },
          "itemsPerPage": {
            "type": "integer",
            "description": "How many entries this page holds.",
            "format": "int32"
          },
          "Resources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScimGroupResource"
            },
            "description": "The groups on this page. Capitalised because SCIM defines it that way."
          }
        },
        "description": "A SCIM ListResponse envelope holding groups."
      },
      "ScimError": {
        "required": [
          "schemas",
          "detail",
          "status"
        ],
        "type": "object",
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Always contains \u0060urn:ietf:params:scim:api:messages:2.0:Error\u0060."
          },
          "detail": {
            "type": "string",
            "description": "What went wrong, written for a person reading a provisioning log."
          },
          "status": {
            "type": "string",
            "description": "The HTTP status code, as a string."
          },
          "scimType": {
            "type": [
              "null",
              "string"
            ],
            "description": "The SCIM error type, for example \u0060invalidFilter\u0060."
          }
        },
        "description": "The SCIM error envelope. It replaces the problem\u002Bjson shape on every SCIM endpoint."
      }
    },
    "responses": {
      "BadRequest": {
        "description": "The request was malformed or failed validation.",
        "content": {
          "application/problem\u002Bjson": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "The API key is missing, invalid, expired or revoked. A US organization calling\nwithout \u0060X-RB-Region: us\u0060 also lands here, because the request reached the wrong\nregion.",
        "content": {
          "application/problem\u002Bjson": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "Forbidden": {
        "description": "The key is valid but lacks the permission or the project scope for this call.\nA scoped key is also refused on organization level operations by design.",
        "content": {
          "application/problem\u002Bjson": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "NotFound": {
        "description": "The resource does not exist, or it belongs to another organization or project.\nBoth cases answer the same way on purpose, so the API cannot be used to probe\nfor foreign identifiers.",
        "content": {
          "application/problem\u002Bjson": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "Conflict": {
        "description": "The resource changed since you read it. Reload it, reapply your change and send\nthe fresh \u0060rowVersion\u0060. The \u0060code\u0060 is \u0060CONCURRENCY_CONFLICT\u0060.",
        "content": {
          "application/problem\u002Bjson": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "ScimError": {
        "description": "A SCIM error envelope.",
        "content": {
          "application/scim\u002Bjson": {
            "schema": {
              "$ref": "#/components/schemas/ScimError"
            }
          }
        }
      }
    },
    "parameters": {
      "ProjectId": {
        "name": "ProjectId",
        "in": "path",
        "description": "Public id of the project.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "ProjectIdQuery": {
        "name": "ProjectIdQuery",
        "in": "query",
        "description": "Public id of the project.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "SpecId": {
        "name": "SpecId",
        "in": "path",
        "description": "Public id of the API specification.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "VersionId": {
        "name": "VersionId",
        "in": "path",
        "description": "Public id of the specification version.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "DocId": {
        "name": "DocId",
        "in": "path",
        "description": "Public id of the documentation.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "DocVersionId": {
        "name": "DocVersionId",
        "in": "path",
        "description": "Public id of the documentation version.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "PageId": {
        "name": "PageId",
        "in": "path",
        "description": "Public id of the documentation page.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "OrgSlug": {
        "name": "OrgSlug",
        "in": "path",
        "description": "Slug of the organization, as shown in Settings.",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "Skip": {
        "name": "Skip",
        "in": "query",
        "description": "Number of items to skip. Defaults to 0.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      },
      "Take": {
        "name": "Take",
        "in": "query",
        "description": "Maximum number of items to return.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      },
      "SpecFormat": {
        "name": "SpecFormat",
        "in": "query",
        "description": "Output format. Defaults to \u0060yaml\u0060.",
        "schema": {
          "type": "string"
        }
      },
      "ScimId": {
        "name": "ScimId",
        "in": "path",
        "description": "SCIM id of the resource.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "ScimStartIndex": {
        "name": "ScimStartIndex",
        "in": "query",
        "description": "1-based index of the first result. Defaults to 1.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      },
      "ScimCount": {
        "name": "ScimCount",
        "in": "query",
        "description": "Maximum number of results per page. Defaults to 100.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      }
    },
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "description": "An organization API key, created under Settings then API Keys. Keys start with\n\u0060rb_live_\u0060 and carry their own permission scopes, so a key only reaches what it\nwas granted.",
        "name": "X-API-Key",
        "in": "header"
      },
      "ScimBearerAuth": {
        "type": "http",
        "description": "The SCIM token of the organization, issued when SCIM provisioning is enabled.\nIt is separate from an API key and only unlocks the SCIM endpoints.",
        "scheme": "bearer"
      }
    }
  },
  "tags": [
    {
      "name": "CI \u0026 Test Runs",
      "description": "Run test suites from a pipeline and collect the result. These endpoints back the\n\u0060routebase\u0060 CLI and the Routebase GitHub Action, and they are the ones a CI job\ncalls directly.\n"
    },
    {
      "name": "API Specs",
      "description": "Read specifications and their versions, export them as OpenAPI, and record which\nversion a deployment put into an environment.\n"
    },
    {
      "name": "Security",
      "description": "Start an OWASP scan, poll it to completion, and read the findings. The SARIF\nexport feeds GitHub code scanning and comparable tools.\n"
    },
    {
      "name": "Docs as Code",
      "description": "Keep documentation pages in your own repository and push them into Routebase from\na pipeline. These endpoints back \u0060routebase docs push\u0060 and \u0060routebase docs pull\u0060.\n"
    },
    {
      "name": "SCIM",
      "description": "SCIM 2.0 user and group provisioning, as consumed by Okta, Microsoft Entra ID and\nother identity providers. Available on plans that include SSO.\n"
    }
  ],
  "x-routebase-folders": [
    {
      "name": "API Specs",
      "children": []
    },
    {
      "name": "CI \u0026 Test Runs",
      "children": []
    },
    {
      "name": "Docs as Code",
      "children": []
    },
    {
      "name": "SCIM",
      "children": []
    },
    {
      "name": "Security",
      "children": []
    }
  ]
}