{
  "openapi": "3.1.0",
  "info": {
    "title": "Nexus API",
    "version": "1.10.0",
    "summary": "Versioned REST API for the test data of one Jira project, plus the CI API batch endpoint.",
    "description": "Nexus API v1. Routes for test cases and their versions, reusable test sets, cycles, plans, runs, step results, shared preconditions, requirement coverage and (with the opt-in `datasets:read` scope) data sets for ONE project, served by the dynamic Forge web trigger `nexus-read-api`. Authenticate with `Authorization: Bearer <API key>` where the key has the opt-in \"Read test data\" (`read`) scope; the data set routes also need \"Read test data sets\" (`datasets:read`). A key with Read sees every non-restricted test record in its project: records with a Jira issue-security level are never returned and are counted in `omittedRestricted`. Sensitive test-data values are always masked. Every v1 answer carries `Nexus-Api-Version`, `Nexus-Request-Id` and `RateLimit-*` headers. Write routes (opt-in scopes `cases:write`, `cycles:write`, `plans:write`, `results:write`, `preconditions:write` and `datasets:write`; each also needs `read`) create and change test data as the app, without a person's Jira permissions: every target and every referenced issue is judged by Nexus itself (this project only, nothing with an issue-security level), nothing is ever deleted for good except a shared precondition (the Trash holds the rest), a data set classified sensitive can only be changed in Nexus, and creates need an `Idempotency-Key`. Compatibility promise (the full policy is docs/api/compatibility-policy.md, published on the Nexus API docs page under Compatibility): within v1 only additive changes; deprecations get at least 12 months notice with `Deprecation` and `Sunset` headers; the `?op=` form is deprecated at 1.0 and switched off 12 months after launch. Source of truth: docs/api-contracts.md section 1y and docs/design/external-api-v1.md."
  },
  "servers": [
    {
      "url": "https://{forge-trigger-host}/x1/{trigger-id}",
      "description": "The Nexus API URL shown on the API keys screen (Forge generates it per installation). Paths below are appended to it.",
      "variables": {
        "forge-trigger-host": {
          "default": "example.atlassian-dev.net"
        },
        "trigger-id": {
          "default": "abc"
        }
      }
    }
  ],
  "security": [
    {
      "bearerKey": []
    }
  ],
  "tags": [
    {
      "name": "Test cases"
    },
    {
      "name": "Cycles"
    },
    {
      "name": "Runs"
    },
    {
      "name": "Coverage"
    },
    {
      "name": "Test sets"
    },
    {
      "name": "Plans"
    },
    {
      "name": "Preconditions"
    },
    {
      "name": "Data sets"
    },
    {
      "name": "Op form (deprecated)",
      "description": "The original `?op=` form of the Read API."
    },
    {
      "name": "CI API (batch, static responses)",
      "description": "A bounded batch of write operations on the separate CI API trigger."
    }
  ],
  "paths": {
    "/v1/test-cases": {
      "get": {
        "operationId": "casesList",
        "summary": "List test cases",
        "description": "Test cases of the key's project, newest key first. Same items as `?op=testCases`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Folder"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "$ref": "#/components/parameters/Status"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "post": {
        "operationId": "casesCreate",
        "summary": "Create a test case",
        "description": "Creates one test case: steps, folder, label, priority, requirement links, all through the same service the Create dialog uses. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 5 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 5,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "summary"
                ],
                "properties": {
                  "summary": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255,
                    "description": "The name. Text is cleaned of control characters."
                  },
                  "steps": {
                    "type": "array",
                    "maxItems": 500,
                    "items": {
                      "$ref": "#/components/schemas/Step"
                    },
                    "description": "The whole step table (replaces the stored one on update)."
                  },
                  "preconditions": {
                    "type": "string",
                    "maxLength": 4000
                  },
                  "labels": {
                    "type": "array",
                    "maxItems": 50,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 255,
                      "pattern": "^\\S+$"
                    },
                    "description": "Jira labels (replaces the stored list). `nexus-trash` and `nexus-trash-session` are reserved for the Trash and are refused with `400 invalid-value`."
                  },
                  "priorityId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "pattern": "^[A-Za-z0-9_-]{1,64}$",
                    "description": "A Jira priority id; null clears it (update)."
                  },
                  "folderPath": {
                    "type": "string",
                    "maxLength": 400,
                    "description": "An existing folder, top level first (`A/B`). A missing folder is `404 folder-not-found`; folders are never created."
                  },
                  "automationKey": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "The Automation Key; `\"\"` clears it (update)."
                  },
                  "testType": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 100,
                    "description": "One of the project's Test Case Type values."
                  },
                  "requirementKeys": {
                    "type": "array",
                    "maxItems": 10,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                      "maxLength": 40
                    },
                    "description": "Requirements to link (same project; the project's requirement type rules apply). A Test Case, Test Set or Test Execution is never a requirement (`404 not-found`)."
                  },
                  "externalKey": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "A long-lived dedupe key (beyond 24 hours): the same externalKey returns the case it created."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-cases/features": {
      "post": {
        "operationId": "casesCreateFromFeature",
        "summary": "Create a test case from a .feature file",
        "description": "Creates a Gherkin test case from one .feature file that names no test case (BDD feature sync, added in 1.5). The case is named after the `Feature:` line, filed in its `@folder:` folder when that exists, and its Automation Key is set to its own issue key so Cucumber results tagged with it are recorded on it. `Idempotency-Key` is required; `externalKey` (for example `feature:<hash of the file path>`) dedupes beyond 24 hours. Refused: a file already tagged with a case of this project (`409 feature-tagged`; use PUT), a file tagged only with another project's case (`400 foreign-key`). The answer carries `key`, `label` and the new `revision`. Write budget weight 5.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 5,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "content"
                ],
                "properties": {
                  "content": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 204800,
                    "description": "The whole .feature file (at most 200 KiB)."
                  },
                  "externalKey": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Long-lived dedupe key; the same value never creates a second case."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-cases/{key}": {
      "get": {
        "operationId": "casesGet",
        "summary": "Get one test case",
        "description": "One test case with its steps, preconditions, links and requirements; sensitive test-data values are masked. Same item as `?op=testCase`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "patch": {
        "operationId": "casesUpdate",
        "summary": "Update a test case",
        "description": "Changes the fields sent (others stay). `steps` and `preconditions` replace the stored design; a version is cut. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "summary": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255,
                    "description": "The name. Text is cleaned of control characters."
                  },
                  "steps": {
                    "type": "array",
                    "maxItems": 500,
                    "items": {
                      "$ref": "#/components/schemas/Step"
                    },
                    "description": "The whole step table (replaces the stored one on update)."
                  },
                  "preconditions": {
                    "type": "string",
                    "maxLength": 4000
                  },
                  "labels": {
                    "type": "array",
                    "maxItems": 50,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 255,
                      "pattern": "^\\S+$"
                    },
                    "description": "Jira labels (replaces the stored list). `nexus-trash` and `nexus-trash-session` are reserved for the Trash and are refused with `400 invalid-value`."
                  },
                  "priorityId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "pattern": "^[A-Za-z0-9_-]{1,64}$",
                    "description": "A Jira priority id; null clears it (update)."
                  },
                  "folderPath": {
                    "type": "string",
                    "maxLength": 400,
                    "description": "An existing folder, top level first (`A/B`). A missing folder is `404 folder-not-found`; folders are never created."
                  },
                  "automationKey": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "The Automation Key; `\"\"` clears it (update)."
                  },
                  "testType": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 100,
                    "description": "One of the project's Test Case Type values."
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "casesTrash",
        "summary": "Move a test case to the Trash",
        "description": "Reversible (`restore`). Nothing is ever deleted for good through the API. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/cycles": {
      "get": {
        "operationId": "cyclesList",
        "summary": "List cycles",
        "description": "Test cycles (reusable libraries are not cycles). Same items as `?op=cycles`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "$ref": "#/components/parameters/Status"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CycleListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "post": {
        "operationId": "cyclesCreate",
        "summary": "Create a cycle",
        "description": "A cycle holds runs. `fixVersionId` must be a version of this project. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 5 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 5,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  },
                  "folderPath": {
                    "type": "string",
                    "maxLength": 400,
                    "description": "An existing folder, top level first (`A/B`). A missing folder is `404 folder-not-found`; folders are never created."
                  },
                  "fixVersionId": {
                    "type": "string",
                    "pattern": "^\\d{1,20}$",
                    "description": "A version of this project."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/cycles/{key}": {
      "get": {
        "operationId": "cyclesGet",
        "summary": "Get one cycle with its runs",
        "description": "One cycle and a page of its runs. Same answer as `?op=cycle`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CycleResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "patch": {
        "operationId": "cyclesUpdate",
        "summary": "Rename a cycle or change its release",
        "description": "A closed, locked or archived cycle answers `409` with its own code. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  },
                  "fixVersionId": {
                    "type": "string",
                    "pattern": "^\\d{1,20}$",
                    "description": "A version of this project."
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "cyclesTrash",
        "summary": "Move a cycle to the Trash",
        "description": "Reversible; its runs are hidden with it. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/runs": {
      "get": {
        "operationId": "runsList",
        "summary": "List runs",
        "description": "Test executions. Same items as `?op=runs`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/CycleKey"
          },
          {
            "$ref": "#/components/parameters/Status"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RunListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/runs/{key}/steps": {
      "get": {
        "operationId": "runsSteps",
        "summary": "List the step results of a run",
        "description": "The latest step results of one run, with the `revision` each row carries. Statuses are the customer names. Same items as `?op=runSteps` plus `revision`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RunStepsResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/coverage": {
      "get": {
        "operationId": "coverageGet",
        "summary": "Requirement coverage",
        "description": "Coverage status of the requirements in scope. Same items as `?op=coverage`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Coverage"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Scope"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoverageResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/test-cases/{key}/versions": {
      "get": {
        "operationId": "casesVersions",
        "summary": "List the versions of a test case",
        "description": "The saved versions of one test case (number, reason, note, kind, step count, dates), newest first, without the version text. The note is masked with the case's sensitive test data. Restoring a version is not part of the API. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseVersionsResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/test-cases/{key}/feature": {
      "get": {
        "operationId": "casesFeature",
        "summary": "Get a test case's .feature file",
        "description": "The test case's Gherkin design as the Cucumber .feature file Nexus exports (Import / Export), with its revision, for keeping .feature files in a repository in step with Nexus (BDD feature sync, added in 1.4). Sensitive test data and secret-looking literals are masked before the file is rendered; `masked` is true when masking changed anything, and a sync client must then not compare or write the file. `revision` is the first 16 hex characters of SHA-256 over `content` exactly. A case without a Gherkin design answers `kind: other` with `content: null`. A missing, other-project, restricted, trashed or Obsolete case is 404 (trashed and Obsolete cases are returned with `includeTrashed=true`, flagged `retired`). Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseFeatureResponse"
                },
                "example": {
                  "schemaVersion": 1,
                  "op": "caseFeature",
                  "project": "NEX",
                  "source": "jira",
                  "item": {
                    "key": "NEX-45",
                    "label": "NEX-TC-12",
                    "kind": "gherkin",
                    "fileName": "NEX-45.feature",
                    "content": "@NEX-45\nFeature: Checkout\n\n  @NEX-45\n  Scenario: Pay by card\n    Given a basket\n    Then the receipt shows the total\n",
                    "revision": "3f2a9c0d11b2e4f5",
                    "masked": false,
                    "reason": null,
                    "folderPath": null,
                    "status": "Ready",
                    "retired": false,
                    "updated": "2026-10-17T03:00:00.000Z"
                  },
                  "omittedRestricted": 0,
                  "requestId": "r_AAAAAAAAAAAAAAAAAAAAAA"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "put": {
        "operationId": "casesUpdateFeature",
        "summary": "Replace a test case's Gherkin with a .feature file",
        "description": "Pushes one Cucumber .feature file from a repository into the test case it is tagged with (BDD feature sync, added in 1.5). `If-Match` must carry the `revision` from `GET /v1/test-cases/{key}/feature`; a different revision is `412 precondition-failed` and nothing is written, so a newer change in Nexus is never overwritten. The file is parsed by Nexus (English keywords; Background, Scenario Outline, Examples, data tables and doc strings kept; `@KEY` and `@folder:` tags are not stored as tags). A `@folder:` tag files the case in that folder when it exists; the API never makes folders (warning `folder-not-found`). Refused: a masked case (`409 sensitive-case-ui-only`), a classic-steps case (`409 not-gherkin`), stored Gherkin that cannot be rendered (`409 feature-unreadable`), a file tagged with another case (`400 feature-key-mismatch`) or only with another project's case (`400 foreign-key`), a file with no scenarios or a scenario without steps (`400 invalid-gherkin`). The answer carries the new `revision`; `changed: false` when the file already matched. Write budget weight 3.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional",
        "x-nexus-if-match": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "content"
                ],
                "properties": {
                  "content": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 204800,
                    "description": "The whole .feature file (at most 200 KiB)."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-cases/{key}/script": {
      "get": {
        "operationId": "casesScript",
        "summary": "Get a test case's Playwright script",
        "description": "The test case's current Playwright script, recorded with Playwright's own recorder (codegen or the VS Code extension) and uploaded on the case in Nexus, with its version list (added in 1.6). Nexus never runs it: it is text for your repository or CI. Sensitive test data and secret-looking literals are masked before the code is returned; `masked` is true when masking changed anything. `sha256` is always of the stored copy; a stored copy that fails its checksum is returned with `verified: false` and `code: null`. `item` is null when the case has no script. 404 while Playwright scripts are switched off for the site, and for a missing, other-project, restricted, trashed or Obsolete case (trashed and Obsolete cases with `includeTrashed=true`). Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseScriptResponse"
                },
                "example": {
                  "schemaVersion": 1,
                  "op": "caseScript",
                  "project": "NEX",
                  "source": "sql",
                  "key": "NEX-45",
                  "item": {
                    "automationKey": "NEX-45",
                    "version": 2,
                    "fileName": "NEX-45.spec.ts",
                    "sha256": "9f2c0e7d5b6a4c3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e",
                    "bytes": 412,
                    "verified": true,
                    "masked": false,
                    "code": "import { test, expect } from '@playwright/test';\n\ntest('NEX-45: Sign in', async ({ page }) => {\n  await page.goto('https://app.example.com/login');\n  await page.getByLabel('Password').fill((process.env.NEXUS_PASSWORD ?? ''));\n  await page.getByRole('button', { name: 'Sign in' }).click();\n  await expect(page.getByText('Welcome back')).toBeVisible();\n});\n",
                    "createdAt": "2026-10-17T01:00:00.000Z",
                    "warnings": [],
                    "status": "approved",
                    "approvedSha256": "9f2c0e7d5b6a4c3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e",
                    "approvedBy": null,
                    "approvedAt": "2026-10-17T02:00:00.000Z",
                    "reviewUrl": "browse/NEX-45",
                    "versions": [
                      {
                        "version": 2,
                        "sha256": "9f2c0e7d5b6a4c3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e",
                        "bytes": 412,
                        "createdAt": "2026-10-17T01:00:00.000Z"
                      },
                      {
                        "version": 1,
                        "sha256": "0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9",
                        "bytes": 398,
                        "createdAt": "2026-10-16T22:10:00.000Z"
                      }
                    ]
                  },
                  "omittedRestricted": 0,
                  "requestId": "r_AAAAAAAAAAAAAAAAAAAAAA"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/test-sets": {
      "get": {
        "operationId": "testSetsList",
        "summary": "List reusable test sets",
        "description": "Reusable Test Sets (libraries of test cases). Cycles are under `/v1/cycles`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "$ref": "#/components/parameters/Status"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestSetListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "post": {
        "operationId": "testSetsCreate",
        "summary": "Create a reusable test set (library)",
        "description": "A library is a set of test cases that is not a cycle. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 5 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 5,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  },
                  "folderPath": {
                    "type": "string",
                    "maxLength": 400,
                    "description": "An existing folder, top level first (`A/B`). A missing folder is `404 folder-not-found`; folders are never created."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-sets/{key}": {
      "get": {
        "operationId": "testSetsGet",
        "summary": "Get one reusable test set with its members",
        "description": "One reusable Test Set and a page of its member test cases. A member with an issue-security level, a trashed or Obsolete one (unless `includeTrashed`) and another project's are not listed; restricted ones are counted in `omittedRestricted`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestSetResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "patch": {
        "operationId": "testSetsUpdate",
        "summary": "Rename a test set",
        "description": "A cycle key is `404` here. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "testSetsTrash",
        "summary": "Move a test set to the Trash",
        "description": "Reversible. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/plans": {
      "get": {
        "operationId": "plansList",
        "summary": "List test plans",
        "description": "The project's test plans, newest updated first. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "post": {
        "operationId": "plansCreate",
        "summary": "Create a plan",
        "description": "At most 200 plans a project (`plan-limit`); names are unique. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "ownerAccountId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 128,
                    "description": "Data only; never taken from the caller."
                  },
                  "versionId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "pattern": "^\\d{1,20}$"
                  },
                  "startDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date"
                  },
                  "endDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/plans/{id}": {
      "get": {
        "operationId": "plansGet",
        "summary": "Get one test plan with its cycles",
        "description": "One plan and the cycles of it that this key may see. Restricted cycles are counted in `omittedRestricted`, never listed. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "patch": {
        "operationId": "plansUpdate",
        "summary": "Change a plan",
        "description": "Only the fields sent change (`status` and `details` are API 1.1). A request that sends several of plan fields, `details` and `status` applies them in that order and is not atomic across the groups; every value is checked first. `baseRevision` (with `details`) refuses a field changed since that revision with `409 stale-field`. A closed plan takes only `{\"status\": \"active\"}`; anything else is `409 plan-closed`. `409 detail-too-large` when the details would pass 120 KB. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "ownerAccountId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 128,
                    "description": "Data only; never taken from the caller."
                  },
                  "versionId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "pattern": "^\\d{1,20}$"
                  },
                  "startDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date"
                  },
                  "endDate": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date"
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "draft",
                      "active",
                      "closed"
                    ],
                    "description": "The plan's own state. A closed plan takes no change except `status: \"active\"` (reopen); everything else is `409 plan-closed`."
                  },
                  "details": {
                    "type": "object",
                    "additionalProperties": false,
                    "minProperties": 1,
                    "properties": {
                      "scope": {
                        "type": "string",
                        "maxLength": 4000,
                        "description": "What the plan covers. Plain text with light Markdown; at most 4,000 characters."
                      },
                      "strategy": {
                        "type": "string",
                        "maxLength": 4000,
                        "description": "How the plan will be tested."
                      },
                      "riskLevel": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "enum": [
                          "low",
                          "medium",
                          "high",
                          "critical",
                          null
                        ]
                      },
                      "riskNotes": {
                        "type": "string",
                        "maxLength": 4000,
                        "description": "Why the risk level is what it is."
                      },
                      "entryCriteria": {
                        "type": "string",
                        "maxLength": 4000,
                        "description": "What must be true before testing starts."
                      },
                      "exitCriteria": {
                        "type": "string",
                        "maxLength": 4000,
                        "description": "What must be true before testing may stop."
                      }
                    },
                    "description": "Only the fields sent change."
                  },
                  "baseRevision": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 2000000000,
                    "description": "The `revision` you read. Only valid with `details` or `customFields`."
                  },
                  "customFields": {
                    "type": "object",
                    "minProperties": 1,
                    "maxProperties": 20,
                    "additionalProperties": {
                      "oneOf": [
                        {
                          "type": "string",
                          "maxLength": 2000
                        },
                        {
                          "type": "number"
                        },
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "maxLength": 80
                          },
                          "maxItems": 50
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "description": "Plan fields to change (API 1.8): `{ \"<field id or name>\": value }`. A key must name one of the project's ACTIVE plan fields (an id, or the name ignoring case); anything else is `400 unknown-field`. `null` (or `[]`, `\"\"`, `false`) clears a value, except a required field (`400 invalid-value`, code `required`). A radio value is a choice id or label, a multi-select value an array of those; a text is plain text; a date is `YYYY-MM-DD`; a datetime is an ISO 8601 instant with a zone (stored in UTC at whole minutes). Applied with `details` in one write: one revision, and `baseRevision` guards both (`409 stale-field` names `customFields.<id>`). A closed plan is `409 plan-closed`. Not applied on create."
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "plansDelete",
        "summary": "Delete a plan",
        "description": "Plans are Nexus records, so this removes the record. The cycles stay. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/plans/{id}/facts": {
      "get": {
        "operationId": "plansFacts",
        "summary": "Get the facts of up to five cycles of a plan",
        "description": "Progress by last executed result, each case's last result and the Bugs linked to the runs, for one to five of the plan's cycles. A cycle not read within the call's time budget answers `skipped: deferred`; ask for it again. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/PlanCycles"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanFactsResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/runs/{key}": {
      "get": {
        "operationId": "runsGet",
        "summary": "Get one run",
        "description": "One test execution (run), as `/v1/runs` lists it. Step results are under `/v1/runs/{key}/steps`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RunResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/preconditions": {
      "get": {
        "operationId": "preconditionsList",
        "summary": "List shared preconditions",
        "description": "The project's shared preconditions with the number of test cases that use each. Text is masked with the project's sensitive test data. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Preconditions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreconditionListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "post": {
        "operationId": "preconditionsCreate",
        "summary": "Create a shared precondition",
        "description": "A name (1 to 80 characters, unique in the project, no semicolon) and a text (1 to 2,000 characters). At most 50 per project. The answer carries the id, name and time, never the text. Needs the `preconditions:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Preconditions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          }
        },
        "x-nexus-scope": "preconditions:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name",
                  "text"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/preconditions/{id}": {
      "get": {
        "operationId": "preconditionsGet",
        "summary": "Get one shared precondition",
        "description": "One shared precondition, masked like the list. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Preconditions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreconditionResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "patch": {
        "operationId": "preconditionsUpdate",
        "summary": "Update a shared precondition",
        "description": "Send the fields to change; the other keeps what is stored. Changing the text changes what every test case using it shows. Needs the `preconditions:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Preconditions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "preconditions:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "text": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "preconditionsDelete",
        "summary": "Delete a shared precondition",
        "description": "A precondition that test cases use (not counting cases in the Trash) is `409 in-use` unless the body says `force: true`; then those cases simply stop showing it. This is the one delete in the API: the library holds settings, not test records. Needs the `preconditions:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Preconditions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "preconditions:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "force": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets": {
      "get": {
        "operationId": "dataSetsList",
        "summary": "List test data sets",
        "description": "The project's data sets. Needs the opt-in `datasets:read` scope: a key with only Read gets 403. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/IncludeArchived"
          },
          {
            "$ref": "#/components/parameters/Classification"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DataSetListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "post": {
        "operationId": "dataSetsCreate",
        "summary": "Create a test data set",
        "description": "Creates an empty data set with an empty draft. It is always created `synthetic` (the strictest class: a draft with personal-looking values cannot be published); its classification, owner group and deletion are only ever changed in Nexus. The answer is the set; `hasDraft` is true. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "description": "Unique in the project (case and spacing ignored) among sets that are not in the Trash."
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 1000
                  },
                  "consumable": {
                    "type": "boolean",
                    "description": "A consumable set hands each row to one run at a time (reserve, consume, release)."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets/{id}": {
      "get": {
        "operationId": "dataSetsGet",
        "summary": "Get one data set",
        "description": "One data set with its columns and published versions. Needs `datasets:read`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DataSetResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "patch": {
        "operationId": "dataSetsUpdate",
        "summary": "Update a test data set",
        "description": "Send the fields to change. A name already used by another set is `409 duplicate-name`; a set in the Trash is `409 data-set-archived`. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100,
                    "description": "Unique in the project (case and spacing ignored) among sets that are not in the Trash."
                  },
                  "description": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 1000
                  },
                  "consumable": {
                    "type": "boolean",
                    "description": "A consumable set hands each row to one run at a time (reserve, consume, release)."
                  },
                  "resetOnRefresh": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "dataSetsTrash",
        "summary": "Move a test data set to the Trash",
        "description": "Hides the set and stops new links; nothing is deleted (restore it with `POST .../restore`). There is no hard delete in the API. A set already in the Trash is `409 already-in-trash`. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/data-sets/{id}/versions/{n}/rows": {
      "get": {
        "operationId": "dataSetsRows",
        "summary": "Page through the rows of a published version",
        "description": "Rows of one published version, keyed by column name. In a data set classified sensitive (or whose classification cannot be read) every value is replaced by `[SENSITIVE_DATA_n]`; the real values are never returned by the API. Needs `datasets:read`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/PathVersion"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DataSetRowsResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/data-sets/{id}/row-states": {
      "get": {
        "operationId": "dataSetsRowStates",
        "summary": "Get the reserved and consumed row counts",
        "description": "Per environment, how many rows of the current version are reserved or consumed (counts only). Needs `datasets:read`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DataSetRowStatesResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/": {
      "get": {
        "operationId": "opForm",
        "summary": "Op form (deprecated at 1.0)",
        "description": "The original Read API: pick the operation with `op`. Deprecated at the 1.0 launch in favour of the `/v1` routes; it keeps working for 12 months after launch, then answers 410. From the announcement every answer of this form carries `Deprecation` (`@<unix seconds>`), `Sunset` (HTTP-date) and `Link: <...>; rel=\"deprecation\"` headers; `/v1` answers never do. The dates are set at the 1.0 launch. Answers are flat (no request id, no message). Limits: 60 requests a minute and 2,000 an hour per key.",
        "parameters": [
          {
            "name": "project",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Z][A-Z0-9_]{1,9}$"
            }
          },
          {
            "name": "op",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "testCases",
                "testCase",
                "cycles",
                "cycle",
                "runs",
                "runSteps",
                "coverage"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "The `nextCursor` of the previous page. Opaque; bound to the op, project and filters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "key",
            "in": "query",
            "description": "testCase, cycle: the Jira issue key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "run",
            "in": "query",
            "description": "runSteps: the Test Execution key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cycle",
            "in": "query",
            "description": "runs: only the runs of this cycle (Test Set key).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "folder",
            "in": "query",
            "description": "testCases: folder path such as `Checkout/Payments` (includes sub-folders).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "testCases, cycles, runs: the Jira status name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "updatedSince",
            "in": "query",
            "description": "testCases, cycles, runs: ISO 8601 instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "scope",
            "in": "query",
            "description": "coverage: `epic:<KEY>` or `fixVersion:<id>`; absent = whole project.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeTrashed",
            "in": "query",
            "description": "Include trashed items and Obsolete Test Cases.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer for the op.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormAnswer"
                }
              }
            }
          },
          "400": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "401": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "403": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "404": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "405": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "429": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "500": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "503": {
            "description": "Flat error `{error, retryAfterSeconds?}`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          },
          "410": {
            "description": "The op form has been switched off (`{\"error\":\"gone\"}`), with the `Link` header. Use the `/v1` routes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpFormError"
                }
              }
            }
          }
        },
        "deprecated": true,
        "tags": [
          "Op form (deprecated)"
        ],
        "x-nexus-scope": "read"
      },
      "post": {
        "operationId": "submitCiOperations",
        "summary": "Submit CI operations",
        "tags": [
          "CI API (batch, static responses)"
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "project",
            "in": "query",
            "required": true,
            "description": "Jira project key. It must match the API key's project.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Z][A-Z0-9_]{1,9}$"
            }
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CiBatch"
              },
              "examples": {
                "createAndReport": {
                  "summary": "Create a test and record a result",
                  "value": {
                    "operations": [
                      {
                        "op": "create-test-case",
                        "summary": "Login with valid credentials",
                        "automationKey": "AUTH-LOGIN-01",
                        "externalKey": "build-4821-login"
                      },
                      {
                        "op": "report-result",
                        "automationKey": "AUTH-LOGIN-01",
                        "status": "passed",
                        "environment": "staging"
                      }
                    ]
                  }
                },
                "setFixedInBuild": {
                  "summary": "Record the build that fixes two Bugs",
                  "value": {
                    "operations": [
                      {
                        "op": "set-fixed-in-build",
                        "bugKeys": [
                          "NEX-812",
                          "NEX-815"
                        ],
                        "build": "2026.09.28-4",
                        "commit": "3f9c2e1"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted. Check the Nexus CI operation log for operation-level outcomes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AcceptedResponse"
                },
                "example": {
                  "status": "accepted"
                }
              }
            }
          },
          "400": {
            "description": "Invalid JSON or operation shape, a malformed replay header, a reused nonce or a timestamp more than 5 minutes out. Nothing is dispatched.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RejectedResponse"
                },
                "example": {
                  "status": "rejected",
                  "reason": "invalid payload"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, revoked or wrong-project API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RejectedResponse"
                },
                "example": {
                  "status": "rejected",
                  "reason": "unauthorized"
                }
              }
            }
          },
          "413": {
            "description": "The body is over 512 KB, the 25-operation work budget is exceeded, or the per-project rate guard was hit. Nothing is dispatched.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RejectedResponse"
                },
                "example": {
                  "status": "rejected",
                  "reason": "payload too large"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure, or the same batch (or Idempotency-Key) is still being processed: send it again shortly.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "status": "error"
                }
              }
            }
          }
        },
        "description": "The CI API is a separate, static web trigger with its own URL and its own `ci` key scope. It is documented here so one file covers every Nexus API. Its responses are fixed and it is not covered by the v1 deprecation schedule.",
        "servers": [
          {
            "url": "https://replace-with-your-project-ci-api-url",
            "description": "Replace with the CI API URL shown in Nexus Project Settings"
          }
        ]
      }
    },
    "/v1/test-cases/{key}/transitions": {
      "post": {
        "operationId": "casesTransition",
        "summary": "Move a test case to a status",
        "description": "Runs the Jira transition and the Nexus workflow validators, as a person would. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "to"
                ],
                "properties": {
                  "to": {
                    "type": "string",
                    "enum": [
                      "Draft",
                      "Ready",
                      "In Repair",
                      "Obsolete"
                    ],
                    "description": "The status to move the case to. The workflow and its validators run as they do for a person."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-cases/{key}/requirements/{reqKey}": {
      "post": {
        "operationId": "casesLinkRequirement",
        "summary": "Link a requirement",
        "description": "The project's requirement link rules apply. Linking twice is not an error. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/PathReqKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional"
      },
      "delete": {
        "operationId": "casesUnlinkRequirement",
        "summary": "Remove a requirement link",
        "description": "Removes the Tests link to that requirement. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/PathReqKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/test-cases/{key}/shared-preconditions": {
      "put": {
        "operationId": "casesSharedPreconditions",
        "summary": "Set the shared preconditions of a case",
        "description": "Replaces the list of shared precondition ids on the case. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "ids"
                ],
                "properties": {
                  "ids": {
                    "type": "array",
                    "maxItems": 10,
                    "items": {
                      "type": "string",
                      "maxLength": 64
                    },
                    "description": "Shared precondition ids; replaces the case's list."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-cases/{key}/restore": {
      "post": {
        "operationId": "casesRestore",
        "summary": "Restore a test case from the Trash",
        "description": "Back to its folder when it still exists. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/test-cases/bulk-create": {
      "post": {
        "operationId": "casesBulkCreate",
        "summary": "Create up to 10 test cases",
        "description": "Each item is the `POST /v1/test-cases` body. Per-item results; no new item starts after 30 s (`not-attempted`: resend with the same Idempotency-Key). Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 5 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 10,
        "x-nexus-weight": 5,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "items"
                ],
                "properties": {
                  "items": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 10,
                    "items": {
                      "type": "object",
                      "additionalProperties": true
                    },
                    "description": "Each item is a create-case body (`summary` required)."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-cases/bulk-update": {
      "post": {
        "operationId": "casesBulkUpdate",
        "summary": "Update up to 25 test cases",
        "description": "Each item is `{key, ...fields}`. Per-item results; duplicate keys are refused. Needs the `cases:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cases:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 25,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "items"
                ],
                "properties": {
                  "items": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 25,
                    "items": {
                      "type": "object",
                      "additionalProperties": true
                    },
                    "description": "The items. The whole body is checked first: one invalid item and nothing runs."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-sets/{key}/members": {
      "post": {
        "operationId": "testSetsAddMembers",
        "summary": "Add test cases to a test set",
        "description": "Up to 100 keys. Per-key results. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 100,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "caseKeys"
                ],
                "properties": {
                  "caseKeys": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                      "maxLength": 40
                    }
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "testSetsRemoveMembers",
        "summary": "Remove test cases from a test set",
        "description": "Up to 100 keys. Removing a non-member is not an error. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 100,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "caseKeys"
                ],
                "properties": {
                  "caseKeys": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                      "maxLength": 40
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/test-sets/{key}/restore": {
      "post": {
        "operationId": "testSetsRestore",
        "summary": "Restore a test set from the Trash",
        "description": "Back to its folder when it still exists. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Test sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/cycles/{key}/runs": {
      "post": {
        "operationId": "cyclesAddRuns",
        "summary": "Add test cases to a cycle",
        "description": "Up to 100 keys; creates one run per case (the Cycle hub's engine) in slices of 10 inside the 30 second write budget: a case not reached is `not-attempted` (send the same Idempotency-Key and body again to continue; cases already done are not repeated). A closed, locked or archived cycle answers `409` and nothing changes. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 100,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "caseKeys"
                ],
                "properties": {
                  "caseKeys": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                      "maxLength": 40
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/cycles/{key}/runs/{runKey}": {
      "delete": {
        "operationId": "cyclesRemoveRun",
        "summary": "Remove a run from a cycle",
        "description": "A run that never started is retired, a run with results is retired not destroyed. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/PathRunKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/cycles/{key}/close": {
      "post": {
        "operationId": "cyclesClose",
        "summary": "Close a cycle",
        "description": "Closing a closed cycle is not an error. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/cycles/{key}/reopen": {
      "post": {
        "operationId": "cyclesReopen",
        "summary": "Reopen a cycle",
        "description": "Reopening an open cycle is not an error. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/cycles/{key}/restore": {
      "post": {
        "operationId": "cyclesRestore",
        "summary": "Restore a cycle from the Trash",
        "description": "Its runs come back with it. Needs the `cycles:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Cycles"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "cycles:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/plans/{id}/cycles": {
      "put": {
        "operationId": "plansSetCycles",
        "summary": "Add and remove a plan's cycles",
        "description": "Each added cycle is judged first (this project, a cycle, not trashed); a refused one is listed under `refused`. A closed plan is `409 plan-closed`. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 100,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "add": {
                    "type": "array",
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                      "maxLength": 40
                    },
                    "description": "Cycles to add (same project, a cycle, not trashed)."
                  },
                  "remove": {
                    "type": "array",
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                      "maxLength": 40
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/runs/{key}/start": {
      "post": {
        "operationId": "runsStart",
        "summary": "Start a run",
        "description": "Starts the run (idempotent: a started run answers with its run id). A closed or archived cycle answers `409`; a run that picks its data rows in the test runner is `409 data-needs-runner`. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/runs/{key}/complete": {
      "post": {
        "operationId": "runsComplete",
        "summary": "Complete a run",
        "description": "Completes the run with the rollup of its steps, exactly the Cycle hub's Complete run (the API never sets a result by hand, and never stops a tester's running timer). A run with no run record is `409 run-not-recordable`; a project result rule that is not met is `409 result-requirements`. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/runs/{key}/reopen": {
      "post": {
        "operationId": "runsReopen",
        "summary": "Reopen a completed run",
        "description": "Moves a completed run back through the Test Execution workflow. A run that holds no result is `409 conflict`; a workflow that offers no way back is `409 no-transition`. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/runs/{key}/assignee": {
      "put": {
        "operationId": "runsAssign",
        "summary": "Assign a run",
        "description": "Sets the run's Jira assignee, or clears it with `null`. The account must be a person Jira knows (`400 invalid-value` otherwise); Jira sends its own assignee notification. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "accountId"
                ],
                "properties": {
                  "accountId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 128,
                    "pattern": "^[A-Za-z0-9:_-]{1,128}$"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/runs/{key}/defects": {
      "post": {
        "operationId": "runsLinkDefect",
        "summary": "Link a Bug to a run",
        "description": "Links an existing Bug of this project to the run. Linking the same Bug twice is not an error (`alreadyLinked`). A Bug of another project, a restricted or trashed one, or an issue that is not a Bug is `404 not-found`. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "bugKey"
                ],
                "properties": {
                  "bugKey": {
                    "type": "string",
                    "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                    "maxLength": 40
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/runs/{key}/steps/{n}": {
      "put": {
        "operationId": "stepsRecord",
        "summary": "Record one step result",
        "description": "Records the result of step `n` (of iteration `iteration` on a data-driven run). Send the `revision` you read from `GET /v1/runs/{key}/steps` as `If-Match`: if a tester (or another call) changed the row since, the answer is `412 precondition-failed` and nothing is written; a missing header is `428 precondition-required`. The answer carries the row's new `revision`. A run that is not In Progress, or whose cycle is closed or archived, is `409`. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/PathStep"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "x-nexus-if-match": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "status"
                ],
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "Pass",
                      "Fail",
                      "Blocked",
                      "Not Applicable"
                    ],
                    "description": "A result name. Not Run is not recordable; an internal RS_ code is refused."
                  },
                  "actualResult": {
                    "type": "string",
                    "maxLength": 4000
                  },
                  "comment": {
                    "type": "string",
                    "maxLength": 4000
                  },
                  "iteration": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "The data row of a data-driven run; omit it on a run without data rows."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/runs/{key}/steps/bulk": {
      "post": {
        "operationId": "stepsBulk",
        "summary": "Record up to 25 step results",
        "description": "Each item is one compare-and-set write with its own `revision`; items run one after another on the run. One invalid item and nothing runs; a stale revision fails that item alone (`precondition-failed`). No new item starts after 30 s: resend with the same Idempotency-Key to run only the items not done. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 25,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "items"
                ],
                "properties": {
                  "items": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 25,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "order",
                        "status",
                        "revision"
                      ],
                      "properties": {
                        "order": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "revision": {
                          "type": "string",
                          "pattern": "^[0-9a-f]{16}$"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "Pass",
                            "Fail",
                            "Blocked",
                            "Not Applicable"
                          ],
                          "description": "A result name. Not Run is not recordable; an internal RS_ code is refused."
                        },
                        "actualResult": {
                          "type": "string",
                          "maxLength": 4000
                        },
                        "comment": {
                          "type": "string",
                          "maxLength": 4000
                        },
                        "iteration": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "The data row of a data-driven run; omit it on a run without data rows."
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/runs/{key}/steps/record-all": {
      "post": {
        "operationId": "stepsRecordAll",
        "summary": "Record one result for every step",
        "description": "Records the result on every step of the latest run that is still Not Run (every data row of a data-driven run), as the Cycle hub's Pass all: a step that already has a result keeps it, and the answer's `steps` list shows what each step holds now. Prefer `steps/{n}` with a revision when a tester may be working on the run. Needs the `results:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Runs"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "results:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "status"
                ],
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "Pass",
                      "Fail",
                      "Blocked",
                      "Not Applicable"
                    ],
                    "description": "A result name. Not Run is not recordable; an internal RS_ code is refused."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets/{id}/restore": {
      "post": {
        "operationId": "dataSetsRestore",
        "summary": "Restore a test data set from the Trash",
        "description": "A name that another set took meanwhile is `409 duplicate-name`. A set that is not in the Trash is `409 not-in-trash`. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/data-sets/{id}/draft": {
      "post": {
        "operationId": "dataSetsStartDraft",
        "summary": "Start (or get) the draft",
        "description": "Returns the set's draft, creating one from the latest published version (columns and rows copied) if there is none. Idempotent. Every draft write needs a draft: without one the answer is `409 no-draft`. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/data-sets/{id}/draft/columns": {
      "put": {
        "operationId": "dataSetsSetColumns",
        "summary": "Replace the draft's columns",
        "description": "The full ordered list of columns (1 to 50). A column named as it is now keeps its id and its values; a new name adds a column; a column left out is removed with its values; `renamedFrom` renames one and keeps its values. A type change that no stored value fits is refused (`400`, `columns[i]`). Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 50,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "columns"
                ],
                "properties": {
                  "columns": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 50,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "type"
                      ],
                      "properties": {
                        "name": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$",
                          "description": "Letters, digits and underscores; unique in the set, case ignored. `row_key` is reserved."
                        },
                        "type": {
                          "type": "string",
                          "enum": [
                            "text",
                            "integer",
                            "decimal",
                            "boolean",
                            "date",
                            "datetime",
                            "enum",
                            "email",
                            "phone_nz",
                            "ird_nz",
                            "nhi_nz",
                            "bank_account_nz",
                            "address_nz",
                            "person_name",
                            "reference"
                          ]
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "options": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 50,
                          "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 100
                          },
                          "description": "Only for `enum`."
                        },
                        "description": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "maxLength": 200
                        },
                        "renamedFrom": {
                          "type": "string",
                          "description": "The name this column has in the draft now, when this call renames it: its values are kept."
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets/{id}/draft/rows": {
      "post": {
        "operationId": "dataSetsUpsertRows",
        "summary": "Add or update draft rows",
        "description": "Up to 500 rows (a body of at most 512 KiB), keyed by `rowKey` and by column name. A row holding a card number is never saved: it is listed in `rejectedRows` by its index and the other rows are saved. The draft holds at most 5,000 rows. A data row batch is one SQL write (no Jira call), so it costs a flat 2 units, not 2 per row. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 500,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "rows"
                ],
                "properties": {
                  "rows": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 500,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "rowKey",
                        "values"
                      ],
                      "properties": {
                        "rowKey": {
                          "type": "string",
                          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$",
                          "description": "A new key adds a row; an existing key updates that row."
                        },
                        "values": {
                          "type": "object",
                          "description": "Column name -> value (string, number, boolean or null). A column you leave out keeps its stored value on an existing row; `null` empties it. A cell is at most 1 KiB, a row 4 KiB. A mask placeholder such as `[SENSITIVE_DATA_1]` or a value starting `••••` is refused (`masked-value`).",
                          "additionalProperties": {
                            "type": [
                              "string",
                              "number",
                              "boolean",
                              "null"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "dataSetsDeleteRows",
        "summary": "Delete draft rows",
        "description": "Removes up to 500 rows of the draft by `rowKey`; a key the draft does not have is ignored. Published versions are never changed. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 500,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "rowKeys"
                ],
                "properties": {
                  "rowKeys": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 500,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets/{id}/draft/publish": {
      "post": {
        "operationId": "dataSetsPublish",
        "summary": "Publish the draft",
        "description": "Publishes the draft as the next version, exactly as Publish in Nexus (`409 nothing-to-publish`, `missing-required-values`, `publish-blocked`). A draft being changed in Nexus at the same moment is `409 draft-busy` with `Retry-After`. The answer carries the version number. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 3 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 3,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "changeNote": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 500
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets/{id}/draft/discard": {
      "post": {
        "operationId": "dataSetsDiscard",
        "summary": "Discard the draft",
        "description": "Throws away the draft and its rows. Published versions are untouched. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/data-sets/{id}/rows/reserve": {
      "post": {
        "operationId": "dataSetsReserveRows",
        "summary": "Reserve rows for a run",
        "description": "Holds rows of a consumable set for a run (the same engine as the CI API's reserve-data-rows). Send exactly one of `count` and `rowKeys`. The answer carries the granted row keys (never values) and when the hold ends. Fewer free rows than asked is a partial grant (`status: partial`, the keys it got); none free is `409 rows-unavailable`; a set that is not consumable is `409 not-consumable`; a run in an archived cycle is `409 cycle-archived`. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 200,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "run",
                  "externalId"
                ],
                "properties": {
                  "run": {
                    "type": "string",
                    "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                    "maxLength": 40,
                    "description": "The key of the run (Test Execution) the rows are held for."
                  },
                  "externalId": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9._-]{1,100}$",
                    "description": "Your own id for this claim; the same id again is the same claim."
                  },
                  "count": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 200
                  },
                  "rowKeys": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 200,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$"
                    }
                  },
                  "environment": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 100
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets/{id}/rows/consume": {
      "post": {
        "operationId": "dataSetsConsumeRows",
        "summary": "Consume reserved rows",
        "description": "Marks the rows this claim holds as used up. Nothing held is `outcome: unchanged`. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 200,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "run",
                  "externalId"
                ],
                "properties": {
                  "run": {
                    "type": "string",
                    "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                    "maxLength": 40,
                    "description": "The key of the run (Test Execution) the rows are held for."
                  },
                  "externalId": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9._-]{1,100}$",
                    "description": "Your own id for this claim; the same id again is the same claim."
                  },
                  "rowKeys": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 200,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/data-sets/{id}/rows/release": {
      "post": {
        "operationId": "dataSetsReleaseRows",
        "summary": "Release reserved rows",
        "description": "Gives the rows this claim holds back. Nothing held is `outcome: unchanged`. Needs the `datasets:write` scope (and `read`). A data set classified sensitive can never be written through the API (`409 sensitive-set-ui-only`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 2 per request); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Data sets"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "datasets:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 200,
        "x-nexus-weight": 2,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "run",
                  "externalId"
                ],
                "properties": {
                  "run": {
                    "type": "string",
                    "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                    "maxLength": 40,
                    "description": "The key of the run (Test Execution) the rows are held for."
                  },
                  "externalId": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9._-]{1,100}$",
                    "description": "Your own id for this claim; the same id again is the same claim."
                  },
                  "rowKeys": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 200,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/plans/{id}/history": {
      "get": {
        "operationId": "plansHistory",
        "summary": "Get the change history of a plan",
        "description": "Who changed what and when, newest first, from the plan's history table (API 1.1). Cycle keys of another project or of a restricted issue are removed from an entry and counted in `omittedRestricted`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanHistoryResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/plans/{id}/comments": {
      "get": {
        "operationId": "plansComments",
        "summary": "List the comments of a plan",
        "description": "Plain-text comments, newest first (API 1.1). Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanCommentsResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "post": {
        "operationId": "plansAddComment",
        "summary": "Add a comment to a plan",
        "description": "Adds one plain-text comment of at most 2,000 characters (API 1.1). It has no author (`authorAccountId: null`) and cannot be edited or deleted through the API. At most 200 comments a plan (`409 too-many-comments`); `409 storage-full` while Nexus storage is nearly full. A closed plan still takes comments. Requires an `Idempotency-Key`. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "required",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "body"
                ],
                "properties": {
                  "body": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/plans/{id}/links": {
      "get": {
        "operationId": "plansLinks",
        "summary": "List the links of a plan",
        "description": "The plan's links to work items, Confluence pages and web addresses (API 1.1). A work item the key may not see is not listed and is counted in `omittedRestricted`. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanLinksResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "put": {
        "operationId": "plansSetLinks",
        "summary": "Add and remove plan links",
        "description": "Adds and removes links (API 1.1), at most 50 in total. A work item key must be a visible, unrestricted, untrashed issue of this project, otherwise it is listed under `refused`; a Confluence or web address must be http or https and is never fetched. A closed plan is `409 plan-closed`. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanLinksResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 50,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [],
                "properties": {
                  "add": {
                    "type": "array",
                    "maxItems": 50,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "kind"
                      ],
                      "properties": {
                        "kind": {
                          "type": "string",
                          "enum": [
                            "issue",
                            "confluence",
                            "url"
                          ]
                        },
                        "issueKey": {
                          "type": "string",
                          "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
                          "maxLength": 40
                        },
                        "url": {
                          "type": "string",
                          "maxLength": 1000
                        },
                        "label": {
                          "type": "string",
                          "maxLength": 120
                        }
                      }
                    }
                  },
                  "remove": {
                    "type": "array",
                    "maxItems": 50,
                    "items": {
                      "type": "string",
                      "pattern": "^pl-[0-9a-f-]{36}$"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/step-fields": {
      "get": {
        "operationId": "stepFieldsList",
        "summary": "List the typed step fields of a project",
        "description": "The project's step-field definitions (the typed columns on every test step): id, name, type, whether each is enabled, required or retired, its choices, range and cap. Read only. A client must treat a type it does not know as text. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StepFieldListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/plans/{id}/rule": {
      "get": {
        "operationId": "plansRule",
        "summary": "Read a plan's membership rule",
        "description": "Whether the plan is static or dynamic and, for a dynamic plan, its rule in structured form and in plain words, its revision, the member count and the last refresh (API 1.3). Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanRuleResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      },
      "put": {
        "operationId": "plansSetRule",
        "summary": "Set a plan's membership rule",
        "description": "Makes the plan dynamic or replaces its rule (API 1.3), then refreshes the members. The rule is validated, requirement keys must be issues of this project the key may see, and the rule may match at most 500 Test Cases (`409 too-many`). `baseRuleRevision` is the revision you read (omit or null for a plan with no rule); another number is `409 stale-rule`. A closed plan is `409 plan-closed`. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanLinksResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "rule"
                ],
                "properties": {
                  "rule": {
                    "$ref": "#/components/schemas/PlanRule"
                  },
                  "baseRuleRevision": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "minimum": 0
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "plansClearRule",
        "summary": "Make a plan static",
        "description": "Removes the membership rule and its members (API 1.3); the plan keeps its cycles. A closed plan is `409 plan-closed`. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/plans/{id}/members": {
      "get": {
        "operationId": "plansMembers",
        "summary": "List the cached members of a dynamic plan",
        "description": "The Test Cases the rule matched at the last refresh (API 1.3), 100 at most a page, keyset paging. A member this key may not see is not listed and is counted in `omittedRestricted`. A static plan is `404 not-dynamic`. This read never refreshes the members. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlanMembersResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/plans/{id}/members/refresh": {
      "post": {
        "operationId": "plansRefreshMembers",
        "summary": "Refresh the members of a dynamic plan",
        "description": "Runs the rule now and updates the members (API 1.3). `429 refresh-too-soon` (with Retry-After) within 60 seconds of the last refresh, `409 plan-closed` for a closed plan, `404 not-dynamic` for a static one, `503 jira-busy` while Jira capacity is being conserved. Needs the `plans:write` scope (and `read`). Limits: 20 write requests a minute and 300 an hour per key, 500 weighted items an hour per key (this route: 1 per item); writes are refused while Jira capacity is being conserved (`503 jira-busy`).",
        "tags": [
          "Plans"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyV1"
          },
          {
            "$ref": "#/components/parameters/NexusTimestamp"
          },
          {
            "$ref": "#/components/parameters/NexusNonce"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (or an idempotent replay).",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Idempotent-Replayed": {
                "$ref": "#/components/headers/IdempotentReplayed"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WriteResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "402": {
            "$ref": "#/components/responses/PaymentRequired"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/TooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMedia"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "plans:write",
        "x-nexus-cost": "write",
        "x-nexus-max-items": 0,
        "x-nexus-weight": 1,
        "x-nexus-idempotency": "optional"
      }
    },
    "/v1/test-cases/{key}/branches": {
      "get": {
        "operationId": "casesBranches",
        "summary": "List the branches of a test case",
        "description": "API 1.10. The named, parallel designs (branches) of one test case: id, name, status (draft, ready or archived), release, the Main version it was made from, step count, lock, revision and dates. No account ids. Names are masked with the case's sensitive test data. 404 while the project has branches turned off. Limits: 60 requests a minute and 2,000 an hour per key.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBranchesResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    },
    "/v1/test-cases/{key}/branches/{id}": {
      "get": {
        "operationId": "casesBranch",
        "summary": "Get one branch of a test case with its design",
        "description": "API 1.10. One branch with its design (steps, preconditions, parameters, data set, free text, checklist or Gherkin), masked like a test case read, and the design's checksum (the value a run records in its `design.checksum`). `readable: false` and `design: null` when the stored branch design can't be read. 404 for a branch of another case, or while branches are off.",
        "tags": [
          "Test cases"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Project"
          },
          {
            "$ref": "#/components/parameters/PathKey"
          },
          {
            "$ref": "#/components/parameters/PathId"
          },
          {
            "$ref": "#/components/parameters/IncludeTrashed"
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "headers": {
              "Nexus-Api-Version": {
                "$ref": "#/components/headers/NexusApiVersion"
              },
              "Nexus-Request-Id": {
                "$ref": "#/components/headers/NexusRequestId"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBranchResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-nexus-scope": "read",
        "x-nexus-cost": "read",
        "x-nexus-max-items": 0
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "A per-project Nexus API key with the Read test data scope."
      },
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Project-specific Nexus API key"
      }
    },
    "parameters": {
      "Project": {
        "name": "project",
        "in": "query",
        "required": true,
        "description": "Jira project key. It must be the key the API key was made for.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Z][A-Z0-9_]{1,9}$"
        }
      },
      "Limit": {
        "name": "limit",
        "in": "query",
        "description": "Page size.",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 50
        }
      },
      "Cursor": {
        "name": "cursor",
        "in": "query",
        "description": "The `nextCursor` of the previous page. Opaque and signed; valid for 24 hours, for the key it was given to, for the same route and filters only.",
        "schema": {
          "type": "string",
          "maxLength": 2048
        }
      },
      "IncludeTrashed": {
        "name": "includeTrashed",
        "in": "query",
        "description": "Include trashed items and Obsolete Test Cases.",
        "schema": {
          "type": "boolean",
          "default": false
        }
      },
      "Folder": {
        "name": "folder",
        "in": "query",
        "description": "Folder path such as `Checkout/Payments` (includes sub-folders).",
        "schema": {
          "type": "string",
          "maxLength": 400
        }
      },
      "Status": {
        "name": "status",
        "in": "query",
        "description": "The Jira status name.",
        "schema": {
          "type": "string",
          "maxLength": 64
        }
      },
      "UpdatedSince": {
        "name": "updatedSince",
        "in": "query",
        "description": "ISO 8601 date or instant; only records updated since then.",
        "schema": {
          "type": "string"
        }
      },
      "CycleKey": {
        "name": "cycle",
        "in": "query",
        "description": "Only the runs of this cycle (Test Set key).",
        "schema": {
          "type": "string"
        }
      },
      "Scope": {
        "name": "scope",
        "in": "query",
        "description": "`epic:<KEY>` or `fixVersion:<id>`; absent = the whole project.",
        "schema": {
          "type": "string"
        }
      },
      "PathKey": {
        "name": "key",
        "in": "path",
        "required": true,
        "description": "The Jira issue key.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
          "maxLength": 40
        }
      },
      "NexusTimestamp": {
        "name": "X-Nexus-Timestamp",
        "in": "header",
        "required": false,
        "description": "When the request was sent: Unix seconds or milliseconds, or ISO-8601. Refused (400) when more than 5 minutes from Nexus's clock.",
        "schema": {
          "type": "string",
          "maxLength": 64
        }
      },
      "NexusNonce": {
        "name": "X-Nexus-Nonce",
        "in": "header",
        "required": false,
        "description": "A one-time value, new for every HTTP send (a retry included). Refused (400) when this API key already sent it.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{16,128}$"
        }
      },
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "description": "The same value on every retry of the same request. For 24 hours after the batch finished, a repeat answers `accepted` without running again (still running: 500, send again shortly). Bound to the request: a different body or query under a used key is a new request.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{16,128}$"
        }
      },
      "PathId": {
        "name": "id",
        "in": "path",
        "required": true,
        "description": "The record id (a plan id `tp-...`, a shared precondition id `pre-...` or a data set UUID).",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9-]{0,63}$",
          "maxLength": 64
        }
      },
      "PathVersion": {
        "name": "n",
        "in": "path",
        "required": true,
        "description": "A published version number of the data set.",
        "schema": {
          "type": "integer",
          "minimum": 1
        }
      },
      "IncludeArchived": {
        "name": "includeArchived",
        "in": "query",
        "description": "Include archived data sets.",
        "schema": {
          "type": "boolean",
          "default": false
        }
      },
      "Classification": {
        "name": "classification",
        "in": "query",
        "description": "Only data sets with this classification.",
        "schema": {
          "type": "string",
          "enum": [
            "synthetic",
            "masked",
            "sensitive"
          ]
        }
      },
      "PlanCycles": {
        "name": "cycles",
        "in": "query",
        "required": true,
        "description": "One to five of the plan's cycle keys, separated by commas.",
        "schema": {
          "type": "string",
          "maxLength": 250
        }
      },
      "PathReqKey": {
        "name": "reqKey",
        "in": "path",
        "required": true,
        "description": "The requirement issue key.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
          "maxLength": 40
        }
      },
      "PathRunKey": {
        "name": "runKey",
        "in": "path",
        "required": true,
        "description": "The run (test execution) issue key.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Z][A-Z0-9_]+-\\d+$",
          "maxLength": 40
        }
      },
      "IdempotencyKeyV1": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "description": "The same value on every retry of the same request (16 to 128 characters of A-Z a-z 0-9 . _ : -). **Required** on routes that create something and on every bulk route. For 24 hours a repeat returns the first answer with `Idempotent-Replayed: true` and changes nothing; a different request under a used key is `422 idempotency-key-reused`; one still running is `409 idempotency-in-progress` with `Retry-After`. A bulk request that ended with `not-attempted` items continues with the same key and runs only the items not done.",
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._:-]{16,128}$"
        }
      },
      "IfMatch": {
        "name": "If-Match",
        "in": "header",
        "required": true,
        "description": "The `revision` of the step row you read (16 hex characters, with or without quotes): the write happens only if the row still has it.",
        "schema": {
          "type": "string",
          "pattern": "^\"?[0-9a-f]{16}\"?$"
        }
      },
      "PathStep": {
        "name": "n",
        "in": "path",
        "required": true,
        "description": "The step number in the run (from 1).",
        "schema": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    "headers": {
      "NexusApiVersion": {
        "description": "The API version that answered, `1.<minor>`.",
        "schema": {
          "type": "string"
        }
      },
      "NexusRequestId": {
        "description": "The request id (also in the body).",
        "schema": {
          "$ref": "#/components/schemas/RequestId"
        }
      },
      "RateLimitLimit": {
        "description": "The key budget for the current window (requests a minute).",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitRemaining": {
        "description": "Requests left in the window.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitReset": {
        "description": "Seconds until the window resets.",
        "schema": {
          "type": "integer"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying.",
        "schema": {
          "type": "integer"
        }
      },
      "Allow": {
        "description": "The methods the route answers.",
        "schema": {
          "type": "string"
        }
      },
      "IdempotentReplayed": {
        "description": "Present and `true` when the answer is a stored replay.",
        "schema": {
          "type": "string",
          "enum": [
            "true"
          ]
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "A parameter is unknown, repeated or invalid (`unknown-parameter`, `invalid-limit`, `invalid-cursor`, ...).",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "No key, a wrong key, a revoked key, or a key for another project (`unauthorized`). All look the same on purpose.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "The key does not carry the scope the route needs (`scope-denied`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "`unknown-route`, or `not-found` for a record that is missing, in another project, restricted or trashed (the same answer for all four).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "The route does not answer this method (`method-not-allowed`).",
        "headers": {
          "Allow": {
            "$ref": "#/components/headers/Allow"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "The key budget is used up (`rate-limited` on reads, `write-budget-exceeded` on writes). `Retry-After` and `RateLimit-Reset` are in seconds; `RateLimit-Limit` is the limit of the window that ran out and `RateLimit-Remaining` is 0.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          },
          "Nexus-Api-Version": {
            "$ref": "#/components/headers/NexusApiVersion"
          },
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          },
          "RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "ServerError": {
        "description": "`unexpected` or `response-too-large`. Quote the request id.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unavailable": {
        "description": "Jira capacity is spent (`jira-quota-exhausted`, `jira-busy`), the mirror is not ready, masking or storage is unavailable. `Retry-After` is in seconds.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "PaymentRequired": {
        "description": "The Nexus licence is not active (`licence-inactive`); reads still work.",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Conflict": {
        "description": "The request conflicts with the current state (`conflict`, `cycle-locked`, `cycle-closed`, `cycle-archived`, `steps-locked`, `no-transition`, `already-in-trash`, `not-in-trash`, `duplicate-name`, `plan-limit`, `plan-closed`, `stale-field`, `detail-too-large`, `too-many-comments`, `too-many-links`, `storage-full`, `idempotency-in-progress`, `too-many-library-members`, `run-not-recordable`, `result-requirements`, `disallowed-result`, `data-needs-runner`, `in-use`, `sensitive-set-ui-only`, `no-draft`, `draft-busy`, `data-set-archived`, `nothing-to-publish`, `missing-required-values`, `publish-blocked`, `storage-budget-exceeded`, `too-many-rows`, `not-consumable`, `rows-unavailable`, `module-off`). Nothing was changed.",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "TooLarge": {
        "description": "The body is over 512 KiB (`body-too-large`).",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "UnsupportedMedia": {
        "description": "Send `Content-Type: application/json` (`unsupported-media-type`).",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unprocessable": {
        "description": "The Idempotency-Key was used for a different request (`idempotency-key-reused`).",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "PreconditionFailed": {
        "description": "The step changed since you read it (`precondition-failed`). Nothing was written; read it again and decide.",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "PreconditionRequired": {
        "description": "The request needs an `If-Match` header (`precondition-required`).",
        "headers": {
          "Nexus-Request-Id": {
            "$ref": "#/components/headers/NexusRequestId"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "TestCaseListItem": {
        "type": "object",
        "description": "testCases item.",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "folderPath": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Folder names from the top level down, e.g. [\"Checkout\",\"Payments\"]; null when the case is not in a folder."
          },
          "testType": {
            "type": [
              "string",
              "null"
            ],
            "description": "The Test Case Type field; null when the case has no type."
          },
          "automationKey": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "TestCase": {
        "type": "object",
        "description": "testCase item. The optional pieces are always present (empty list or null), except unstructuredText and checklistItems, which exist only for their own kind.",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "testType": {
            "type": [
              "string",
              "null"
            ]
          },
          "automationStatus": {
            "type": [
              "string",
              "null"
            ]
          },
          "automationKey": {
            "type": [
              "string",
              "null"
            ]
          },
          "labels": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "parentEpicKey": {
            "type": [
              "string",
              "null"
            ]
          },
          "priority": {
            "type": [
              "string",
              "null"
            ]
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "folderPath": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Folder names from the top level down; null when the case is not in a folder."
          },
          "kind": {
            "type": "string",
            "enum": [
              "steps",
              "gherkin",
              "unstructured",
              "checklist"
            ]
          },
          "textFormat": {
            "type": "string",
            "enum": [
              "plain",
              "md-lite"
            ]
          },
          "estimateMinutes": {
            "type": [
              "integer",
              "null"
            ]
          },
          "requirements": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "summary": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          },
          "updated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "preconditions": {
            "type": [
              "object",
              "string",
              "null"
            ],
            "description": "Rich preconditions text; null when none."
          },
          "sharedPreconditions": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "parameters": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "datasets": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "gherkin": {},
          "unstructuredText": {
            "type": "string"
          },
          "checklistItems": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Cycle": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "environment": {
            "type": [
              "string",
              "null"
            ]
          },
          "progress": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "cases": {
                "type": "object",
                "properties": {
                  "total": {
                    "type": "integer"
                  },
                  "notRun": {
                    "type": "integer"
                  },
                  "inProgress": {
                    "type": "integer"
                  },
                  "pass": {
                    "type": "integer"
                  },
                  "fail": {
                    "type": "integer"
                  },
                  "blocked": {
                    "type": "integer"
                  },
                  "notApplicable": {
                    "type": "integer"
                  },
                  "other": {
                    "type": "integer"
                  }
                }
              },
              "sessions": {
                "type": "object",
                "properties": {
                  "total": {
                    "type": "integer"
                  },
                  "notRun": {
                    "type": "integer"
                  },
                  "inProgress": {
                    "type": "integer"
                  },
                  "pass": {
                    "type": "integer"
                  },
                  "fail": {
                    "type": "integer"
                  },
                  "blocked": {
                    "type": "integer"
                  },
                  "notApplicable": {
                    "type": "integer"
                  },
                  "other": {
                    "type": "integer"
                  }
                }
              }
            }
          },
          "updated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "dependencies": {
            "type": "object",
            "description": "Added in 1.7. Test dependencies: each case key that has prerequisites in this cycle, mapped to its prerequisite case keys. Absent when the cycle has none. Only cases this API may show are named. Read-only: prerequisites are set in Nexus.",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "Run": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "case": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "key": {
                "type": "string"
              },
              "label": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "executorAccountId": {
            "type": [
              "string",
              "null"
            ]
          },
          "environment": {
            "type": [
              "string",
              "null"
            ]
          },
          "configurationName": {
            "type": [
              "string",
              "null"
            ]
          },
          "source": {
            "type": [
              "string",
              "null"
            ]
          },
          "created": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated": {
            "type": [
              "string",
              "null"
            ]
          },
          "executedAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "reopenedAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "attachmentCount": {
            "type": "integer"
          },
          "defectCount": {
            "type": "integer"
          },
          "openDefectCount": {
            "type": "integer"
          }
        }
      },
      "RunStep": {
        "type": "object",
        "properties": {
          "order": {
            "type": "integer"
          },
          "iteration": {
            "type": [
              "integer",
              "null"
            ]
          },
          "iterationLabel": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "Pass",
              "Fail",
              "Blocked",
              "Not Run",
              "Not Applicable"
            ],
            "description": "The customer-facing name, as runs and the exports use. Never an internal RS_ code."
          },
          "action": {
            "type": [
              "string",
              "null"
            ]
          },
          "expected": {
            "type": [
              "string",
              "null"
            ]
          },
          "actualResult": {
            "type": [
              "string",
              "null"
            ]
          },
          "comment": {
            "type": [
              "string",
              "null"
            ]
          },
          "evidenceAttachmentIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "revision": {
            "type": "string",
            "pattern": "^[0-9a-f]{16}$",
            "description": "Compare-and-set token of this step row. Sent back as If-Match by the write routes (a later increment). Present on v1 only."
          },
          "fields": {
            "type": "array",
            "description": "Additive: the step's typed values as frozen when the run started. A person is a bare account id (personal data) or null when erased; labels are the choice labels at that time.",
            "items": {
              "type": "object",
              "required": [
                "name",
                "type",
                "value"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "value": {
                  "type": [
                    "string",
                    "number",
                    "boolean",
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": "string"
                  }
                },
                "labels": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "CoverageItem": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "coverage": {
            "type": "string"
          },
          "excluded": {
            "type": "boolean"
          }
        }
      },
      "RequestId": {
        "type": "string",
        "pattern": "^r_[A-Za-z0-9_-]{22}$",
        "description": "Quote this when you contact support. Also sent as Nexus-Request-Id."
      },
      "CaseListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TestCaseListItem"
            }
          }
        },
        "examples": [
          {
            "schemaVersion": 1,
            "project": "NEX",
            "source": "sql+jira",
            "asOf": "2026-10-14T03:00:00.000Z",
            "items": [
              {
                "key": "NEX-10",
                "label": "NEX-TC-1",
                "summary": "Verify idle session expires",
                "status": "Draft",
                "folderPath": [
                  "Others"
                ],
                "testType": null,
                "automationKey": null,
                "updated": "2026-10-09T00:14:26.765Z"
              }
            ],
            "nextCursor": null,
            "omittedRestricted": 0,
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS"
          }
        ]
      },
      "CycleListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Cycle"
            }
          }
        }
      },
      "RunListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Run"
            }
          }
        }
      },
      "RunStepsResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RunStep"
            }
          },
          "run": {
            "type": "string"
          },
          "runId": {
            "type": [
              "string",
              "null"
            ]
          },
          "totalSteps": {
            "type": "integer"
          }
        },
        "examples": [
          {
            "schemaVersion": 1,
            "project": "NEX",
            "source": "sql",
            "asOf": "2026-10-14T03:00:00.000Z",
            "run": "NEX-66",
            "runId": "1234",
            "totalSteps": 1,
            "items": [
              {
                "order": 1,
                "iteration": null,
                "iterationLabel": null,
                "status": "Pass",
                "action": "Log in",
                "expected": "Logged in",
                "actualResult": null,
                "comment": null,
                "evidenceAttachmentIds": [],
                "revision": "0123456789abcdef"
              }
            ],
            "nextCursor": null,
            "omittedRestricted": 0,
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS"
          }
        ]
      },
      "CoverageResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CoverageItem"
            }
          },
          "scope": {
            "type": "string",
            "description": "`project`, `epic:<KEY>` or `fixVersion:<id>`."
          }
        }
      },
      "CaseResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "item": {
            "$ref": "#/components/schemas/TestCase"
          }
        }
      },
      "CycleResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "runs",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "item": {
            "$ref": "#/components/schemas/Cycle"
          },
          "runs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Run"
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error",
          "message",
          "requestId"
        ],
        "properties": {
          "error": {
            "type": "string",
            "enum": [
              "unauthorized",
              "scope-denied",
              "rate-limited",
              "jira-quota-exhausted",
              "jira-busy",
              "busy",
              "mirror-not-ready",
              "masking-unavailable",
              "steps-unavailable",
              "not-found",
              "folder-not-found",
              "unknown-op",
              "unknown-parameter",
              "invalid-limit",
              "invalid-cursor",
              "invalid-includeTrashed",
              "invalid-folder",
              "invalid-updatedSince",
              "invalid-status",
              "invalid-key",
              "invalid-cycle",
              "invalid-run",
              "invalid-scope",
              "invalid-cycles",
              "invalid-includeArchived",
              "invalid-classification",
              "missing-key",
              "missing-run",
              "method-not-allowed",
              "response-too-large",
              "unexpected",
              "licence-inactive",
              "cycle-locked",
              "cycle-closed",
              "cycle-archived",
              "steps-locked",
              "too-many-library-members",
              "no-transition",
              "stale-client",
              "unknown-route",
              "unsupported-media-type",
              "body-too-large",
              "invalid-body",
              "unknown-field",
              "read-only-field",
              "invalid-value",
              "too-many-items",
              "idempotency-key-required",
              "idempotency-key-reused",
              "idempotency-in-progress",
              "precondition-required",
              "precondition-failed",
              "conflict",
              "write-budget-exceeded",
              "folder-required",
              "requirement-required",
              "create-failed",
              "steps-failed",
              "write-failed",
              "already-in-trash",
              "not-in-trash",
              "plan-limit",
              "duplicate-name",
              "plan-closed",
              "requirement-type-not-allowed",
              "invalid-transition",
              "run-not-recordable",
              "result-requirements",
              "disallowed-result",
              "data-needs-runner",
              "in-use",
              "sensitive-set-ui-only",
              "no-draft",
              "draft-busy",
              "data-set-archived",
              "nothing-to-publish",
              "missing-required-values",
              "publish-blocked",
              "storage-budget-exceeded",
              "too-many-rows",
              "not-consumable",
              "rows-unavailable",
              "masked-value",
              "stale-field",
              "detail-too-large",
              "too-many-comments",
              "too-many-links",
              "storage-full",
              "not-dynamic",
              "invalid-rule",
              "stale-rule",
              "too-many",
              "rule-unreadable",
              "refresh-too-soon",
              "invalid-gherkin",
              "not-gherkin",
              "feature-unreadable",
              "sensitive-case-ui-only",
              "feature-key-mismatch",
              "feature-tagged",
              "foreign-key",
              "module-off"
            ],
            "description": "A fixed machine code."
          },
          "message": {
            "type": "string",
            "description": "Fixed English text for the code. Never echoes input."
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "retryAfterSeconds": {
            "type": "integer",
            "description": "Present on 429 and 503; the same value as Retry-After."
          },
          "details": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "field": {
                  "type": "string"
                },
                "code": {
                  "type": "string"
                }
              }
            }
          }
        },
        "examples": [
          {
            "error": "invalid-cursor",
            "message": "The cursor is not valid for this request. Start the list again.",
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS"
          },
          {
            "error": "rate-limited",
            "message": "Too many requests. Wait for the time in Retry-After and try again.",
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS",
            "retryAfterSeconds": 30
          }
        ]
      },
      "OpFormAnswer": {
        "type": "object",
        "description": "The op form answers with the same members as the matching v1 route, plus `op`, and no requestId. Errors are `{error, retryAfterSeconds?}`.",
        "required": [
          "schemaVersion",
          "op",
          "project",
          "source"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "op": {
            "type": "string"
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira"
            ]
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "items": {
            "type": "array",
            "items": {}
          },
          "item": {},
          "runs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Run"
            }
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          }
        }
      },
      "OpFormError": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string"
          },
          "retryAfterSeconds": {
            "type": "integer"
          }
        }
      },
      "CiBatch": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "operations"
        ],
        "properties": {
          "operations": {
            "type": "array",
            "minItems": 1,
            "maxItems": 25,
            "items": {
              "$ref": "#/components/schemas/Operation"
            }
          }
        },
        "description": "One POST carries 1–25 operations. The 25 is a work budget: each case key in `add-cases-to-cycle` and each Bug key in `set-fixed-in-build` counts one, every other operation counts one. Over 25 is refused whole (413) before anything runs. Every operation is a strict allow-list: one unknown field or bad value refuses the whole batch (400)."
      },
      "Operation": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/CreateTestCase"
          },
          {
            "$ref": "#/components/schemas/UpdateTestCase"
          },
          {
            "$ref": "#/components/schemas/AddToCycle"
          },
          {
            "$ref": "#/components/schemas/AddCasesToCycle"
          },
          {
            "$ref": "#/components/schemas/SetRunAssignee"
          },
          {
            "$ref": "#/components/schemas/SetFixedInBuild"
          },
          {
            "$ref": "#/components/schemas/ReportResult"
          },
          {
            "$ref": "#/components/schemas/RecordDeployment"
          },
          {
            "$ref": "#/components/schemas/RecordEnvironmentEvent"
          },
          {
            "$ref": "#/components/schemas/RecordConfiguration"
          },
          {
            "$ref": "#/components/schemas/ReserveDataRows"
          },
          {
            "$ref": "#/components/schemas/ConsumeDataRows"
          },
          {
            "$ref": "#/components/schemas/ReleaseDataRows"
          }
        ],
        "discriminator": {
          "propertyName": "op",
          "mapping": {
            "create-test-case": "#/components/schemas/CreateTestCase",
            "update-test-case": "#/components/schemas/UpdateTestCase",
            "add-to-cycle": "#/components/schemas/AddToCycle",
            "add-cases-to-cycle": "#/components/schemas/AddCasesToCycle",
            "set-run-assignee": "#/components/schemas/SetRunAssignee",
            "set-fixed-in-build": "#/components/schemas/SetFixedInBuild",
            "report-result": "#/components/schemas/ReportResult",
            "record-deployment": "#/components/schemas/RecordDeployment",
            "record-environment-event": "#/components/schemas/RecordEnvironmentEvent",
            "record-configuration": "#/components/schemas/RecordConfiguration",
            "reserve-data-rows": "#/components/schemas/ReserveDataRows",
            "consume-data-rows": "#/components/schemas/ConsumeDataRows",
            "release-data-rows": "#/components/schemas/ReleaseDataRows"
          }
        }
      },
      "Step": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "action": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 4000
          },
          "data": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 4000
          },
          "expected": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 4000
          },
          "libraryRef": {
            "type": "object",
            "description": "Optional. Present when the step's text came from a manual step library entry. The step always carries its full text; this marker only says which entry and version it came from. On a write the server re-checks it: the entry must be in the case's own project, active, and the step text must be that version's text, otherwise the marker is dropped and the text is kept.",
            "required": [
              "entryId",
              "version",
              "mode"
            ],
            "properties": {
              "entryId": {
                "type": "string",
                "pattern": "^sle_[0-9a-z]{20}$"
              },
              "version": {
                "type": "integer",
                "minimum": 1
              },
              "mode": {
                "type": "string",
                "enum": [
                  "link",
                  "copy"
                ]
              },
              "textHash": {
                "type": "string",
                "pattern": "^[0-9a-f]{16}$"
              },
              "group": {
                "type": "object",
                "required": [
                  "index",
                  "size"
                ],
                "properties": {
                  "index": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "size": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 10
                  }
                }
              }
            }
          },
          "fields": {
            "type": "object",
            "additionalProperties": true,
            "description": "Optional typed step-field values keyed by the field id (see GET /v1/step-fields). A date is YYYY-MM-DD; a date and time is ISO 8601 with Z or an offset (stored as UTC); text, url, select and radio take a string (a radio takes the choice id); a multiselect takes an ARRAY of choice ids; a user takes {\"accountId\": \"...\"} (a person new to the case must be able to browse the project; at most 10 new people a request); a checkbox takes true; a number takes a number. null or [] clears a value. A choice id from another field, an unknown id, a date written as 03/04/2026 or a name instead of an account id is refused with 400 invalid-value."
          },
          "typedFields": {
            "type": "object",
            "readOnly": true,
            "additionalProperties": {
              "$ref": "#/components/schemas/TypedFieldValue"
            },
            "description": "Read only, additive: this step's typed values by field id, in the write form. A person is a bare Atlassian account id (personal data), or null when that person's account was erased. The by-name stepFields on a case read is unchanged."
          }
        }
      },
      "CreateTestCase": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "summary"
        ],
        "properties": {
          "op": {
            "const": "create-test-case"
          },
          "summary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "steps": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/Step"
            }
          },
          "preconditions": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000
          },
          "automationKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "externalKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Caller-supplied idempotency key."
          }
        }
      },
      "UpdateTestCase": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "testCaseKey"
        ],
        "properties": {
          "op": {
            "const": "update-test-case"
          },
          "testCaseKey": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "steps": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/Step"
            },
            "description": "Replaces the complete step table when supplied."
          },
          "preconditions": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 4000,
            "description": "Replaces the preconditions. An empty or blank string, or null, clears them (since 28/09/2026; before, it refused the whole batch). Leave the field out to keep them."
          },
          "automationKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          }
        },
        "description": "Updates a Test Case in the key's project. A part you leave out is kept (since 28/09/2026). `steps` replaces the whole step table; `preconditions` replaces the preconditions (`\"\"` or null clears them). Preconditions alone on an unstructured or checklist design fail with `no-step-table`. A Test Case with a finished run is step-locked (`update-failed`) until it is moved to In Repair."
      },
      "AddToCycle": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "testSetKey",
          "testCaseKey"
        ],
        "properties": {
          "op": {
            "const": "add-to-cycle"
          },
          "testSetKey": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "testCaseKey": {
            "$ref": "#/components/schemas/IssueKey"
          }
        }
      },
      "AddCasesToCycle": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "testSetKey",
          "testCaseKeys"
        ],
        "properties": {
          "op": {
            "const": "add-cases-to-cycle"
          },
          "testSetKey": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "testCaseKeys": {
            "type": "array",
            "minItems": 1,
            "maxItems": 25,
            "uniqueItems": true,
            "items": {
              "$ref": "#/components/schemas/IssueKey"
            }
          }
        },
        "description": "Adds 1–25 Test Cases to one cycle. Each case key counts one against the 25-operation work budget; one log outcome per case."
      },
      "SetRunAssignee": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "runKey",
          "accountId"
        ],
        "properties": {
          "op": {
            "const": "set-run-assignee"
          },
          "runKey": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "accountId": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128,
            "description": "Atlassian account id, or null to unassign.",
            "pattern": "^[A-Za-z0-9:_-]{1,128}$"
          }
        }
      },
      "ReportResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "automationKey",
          "status"
        ],
        "properties": {
          "op": {
            "const": "report-result"
          },
          "automationKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "status": {
            "type": "string",
            "enum": [
              "passed",
              "failed",
              "skipped",
              "blocked"
            ]
          },
          "actualResult": {
            "type": "string",
            "maxLength": 4000
          },
          "environment": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "testSetKey": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "configurationId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          }
        }
      },
      "RecordDeployment": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "environment",
          "version",
          "status",
          "externalId"
        ],
        "properties": {
          "op": {
            "const": "record-deployment"
          },
          "environment": {
            "$ref": "#/components/schemas/Environment"
          },
          "version": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "status": {
            "type": "string",
            "enum": [
              "success",
              "failed",
              "rolled_back"
            ]
          },
          "externalId": {
            "$ref": "#/components/schemas/ExternalId128"
          },
          "release": {
            "type": "string",
            "maxLength": 100
          },
          "component": {
            "type": "string",
            "maxLength": 80
          },
          "build": {
            "type": "string",
            "maxLength": 100
          },
          "commit": {
            "type": "string",
            "maxLength": 40
          },
          "deployedAt": {
            "type": "string",
            "format": "date-time",
            "maxLength": 40,
            "description": "ISO-8601 timestamp, no more than five minutes in the future."
          },
          "evidenceUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 512,
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]://"
          }
        }
      },
      "RecordEnvironmentEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "environment",
          "type",
          "externalId"
        ],
        "properties": {
          "op": {
            "const": "record-environment-event"
          },
          "environment": {
            "$ref": "#/components/schemas/Environment"
          },
          "type": {
            "type": "string",
            "enum": [
              "refresh",
              "outage_start",
              "outage_end",
              "config_change",
              "health"
            ]
          },
          "externalId": {
            "$ref": "#/components/schemas/ExternalId128"
          },
          "healthState": {
            "type": "string",
            "enum": [
              "healthy",
              "degraded",
              "down",
              "unknown"
            ]
          },
          "invalidatesResults": {
            "type": "boolean"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time",
            "maxLength": 40,
            "description": "ISO-8601 timestamp, no more than five minutes in the future."
          },
          "note": {
            "type": "string",
            "maxLength": 500
          }
        },
        "allOf": [
          {
            "if": {
              "properties": {
                "type": {
                  "const": "health"
                }
              },
              "required": [
                "type"
              ]
            },
            "then": {
              "required": [
                "healthState"
              ],
              "properties": {
                "healthState": {
                  "type": "string",
                  "enum": [
                    "healthy",
                    "degraded",
                    "down",
                    "unknown"
                  ]
                }
              }
            },
            "else": {
              "properties": {
                "healthState": false
              }
            }
          }
        ]
      },
      "RecordConfiguration": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "environment",
          "entries",
          "externalId"
        ],
        "properties": {
          "op": {
            "const": "record-configuration"
          },
          "environment": {
            "$ref": "#/components/schemas/Environment"
          },
          "entries": {
            "type": "object",
            "maxProperties": 100,
            "propertyNames": {
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/-]{0,63}$",
              "maxLength": 64
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 256,
              "minLength": 1,
              "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
            },
            "minProperties": 0
          },
          "externalId": {
            "$ref": "#/components/schemas/ExternalId128"
          },
          "merge": {
            "type": "boolean"
          },
          "capturedAt": {
            "type": "string",
            "format": "date-time",
            "maxLength": 40,
            "description": "ISO-8601 timestamp, no more than five minutes in the future."
          },
          "note": {
            "type": "string",
            "maxLength": 500
          }
        },
        "allOf": [
          {
            "if": {
              "properties": {
                "merge": {
                  "const": true
                }
              },
              "required": [
                "merge"
              ]
            },
            "then": {
              "properties": {
                "entries": {
                  "minProperties": 1
                }
              }
            }
          }
        ]
      },
      "ReserveDataRows": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "execution",
          "dataSet",
          "externalId"
        ],
        "properties": {
          "op": {
            "const": "reserve-data-rows"
          },
          "execution": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "dataSet": {
            "$ref": "#/components/schemas/Uuid"
          },
          "externalId": {
            "$ref": "#/components/schemas/ExternalId100"
          },
          "count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          },
          "rowKeys": {
            "$ref": "#/components/schemas/RowKeys"
          },
          "environment": {
            "$ref": "#/components/schemas/Environment"
          }
        },
        "description": "Supply exactly one of count or rowKeys.",
        "oneOf": [
          {
            "required": [
              "count"
            ],
            "properties": {
              "count": {
                "type": "integer",
                "minimum": 1,
                "maximum": 200
              },
              "rowKeys": false
            }
          },
          {
            "required": [
              "rowKeys"
            ],
            "properties": {
              "count": false,
              "rowKeys": {
                "$ref": "#/components/schemas/RowKeys"
              }
            }
          }
        ]
      },
      "ConsumeDataRows": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "execution",
          "dataSet",
          "externalId"
        ],
        "properties": {
          "op": {
            "const": "consume-data-rows"
          },
          "execution": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "dataSet": {
            "$ref": "#/components/schemas/Uuid"
          },
          "externalId": {
            "$ref": "#/components/schemas/ExternalId100"
          },
          "rowKeys": {
            "$ref": "#/components/schemas/RowKeys"
          }
        }
      },
      "ReleaseDataRows": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "execution",
          "dataSet",
          "externalId"
        ],
        "properties": {
          "op": {
            "const": "release-data-rows"
          },
          "execution": {
            "$ref": "#/components/schemas/IssueKey"
          },
          "dataSet": {
            "$ref": "#/components/schemas/Uuid"
          },
          "externalId": {
            "$ref": "#/components/schemas/ExternalId100"
          },
          "rowKeys": {
            "$ref": "#/components/schemas/RowKeys"
          }
        }
      },
      "IssueKey": {
        "type": "string",
        "pattern": "^[A-Z][A-Z0-9_]+-\\d+$"
      },
      "Environment": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      },
      "ExternalId128": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      },
      "ExternalId100": {
        "type": "string",
        "pattern": "^[A-Za-z0-9._-]{1,100}$"
      },
      "Uuid": {
        "type": "string",
        "format": "uuid"
      },
      "RowKeys": {
        "type": "array",
        "minItems": 1,
        "maxItems": 200,
        "uniqueItems": true,
        "items": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$"
        }
      },
      "AcceptedResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "const": "accepted"
          }
        }
      },
      "RejectedResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "status",
          "reason"
        ],
        "properties": {
          "status": {
            "const": "rejected"
          },
          "reason": {
            "type": "string",
            "enum": [
              "invalid payload",
              "unauthorized",
              "payload too large"
            ]
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "const": "error"
          }
        }
      },
      "SetFixedInBuild": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "op",
          "bugKeys",
          "build"
        ],
        "description": "Records the build that fixes one or more Bugs (the `fixedInBuild` issue property), or clears it with `build: null`. Each Bug must be in the API key's project and be a Bug (work type Bug, or the project's configured defect work type). Each Bug key counts one against the 25-operation work budget. One log outcome per Bug: `ok`, or `failed` with `invalid-key`, `invalid-project`, `not-found`, `not-a-bug` or `unexpected`.",
        "properties": {
          "op": {
            "const": "set-fixed-in-build"
          },
          "bugKeys": {
            "type": "array",
            "minItems": 1,
            "maxItems": 25,
            "items": {
              "$ref": "#/components/schemas/IssueKey"
            },
            "description": "Duplicates are ignored."
          },
          "build": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "maxLength": 100,
            "pattern": "^[^\\u0000-\\u001f\\u007f]+$",
            "description": "The build (printable characters, trimmed), or null to clear. Required, so an omitted value is never read as \"clear\"."
          },
          "commit": {
            "type": "string",
            "pattern": "^[0-9A-Fa-f]{7,40}$",
            "description": "Optional commit SHA (7–40 hex characters, stored lower-case). Not allowed with `build: null`."
          }
        },
        "if": {
          "properties": {
            "build": {
              "type": "null"
            }
          }
        },
        "then": {
          "not": {
            "required": [
              "commit"
            ]
          }
        }
      },
      "UploadEnvelope": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "encoding",
          "content"
        ],
        "description": "Body for the **Results URL** (`automation-results` web trigger), not the CI API. Send it with `Content-Type: application/json`. A body is treated as an envelope only when it is a JSON object with both `encoding` and `content`; any other body is processed as a raw report, exactly as before. A malformed envelope (unknown encoding, bad base64, empty content, unknown format) is refused with 400 and nothing is recorded. The query parameters are unchanged. A Nexus from before 28/09/2026 answers 400 to an envelope; the Nexus clients then send the raw file once.",
        "properties": {
          "encoding": {
            "type": "string",
            "enum": [
              "base64",
              "text"
            ],
            "description": "`base64` (preferred: survives any whitespace or character normalisation) or `text` (the report as a JSON string, for when base64 would pass the 5 MB cap)."
          },
          "content": {
            "type": "string",
            "minLength": 1,
            "description": "The report itself. Unwrapped, it may be at most 5 MB. For `base64`, standard base64 with padding and no line breaks."
          },
          "format": {
            "type": "string",
            "description": "Optional: one of the `&format=` names. `&format=` in the query wins, then this, then the unwrapped content is sniffed.",
            "enum": [
              "junit-xml",
              "json",
              "cucumber-json",
              "xunit-xml",
              "mocha-json",
              "playwright-json",
              "robot-xml",
              "nunit-xml",
              "testng-xml",
              "mochawesome-json",
              "newman-json"
            ]
          }
        },
        "examples": [
          {
            "format": "junit-xml",
            "encoding": "base64",
            "content": "PHRlc3RzdWl0ZT48L3Rlc3RzdWl0ZT4="
          }
        ]
      },
      "TestSetListItem": {
        "type": "object",
        "description": "A reusable Test Set (a library of test cases). Cycles are listed under `/v1/cycles`.",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "LibraryMember": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "TestSetListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TestSetListItem"
            }
          }
        }
      },
      "TestSetResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "members",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "item": {
            "$ref": "#/components/schemas/TestSetListItem"
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LibraryMember"
            }
          }
        }
      },
      "PlanListItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "ownerAccountId": {
            "type": [
              "string",
              "null"
            ],
            "description": "A bare Atlassian accountId, never a name or an email."
          },
          "versionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "closed"
            ],
            "description": "The plan's own state. A closed plan takes no change except `status: \"active\"` (reopen); everything else is `409 plan-closed`."
          },
          "riskLevel": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "low",
              "medium",
              "high",
              "critical",
              null
            ]
          },
          "customFields": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "$ref": "#/components/schemas/PlanCustomField"
            },
            "description": "The project's active plan fields and this plan's values (API 1.8). Absent from an answer of an older version; clients ignore unknown fields."
          }
        }
      },
      "PlanCycle": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "archived": {
            "type": "boolean"
          },
          "locked": {
            "type": "boolean"
          }
        }
      },
      "Plan": {
        "type": "object",
        "description": "A plan with its cycles. A cycle that is restricted, trashed, deleted or in another project is not listed; restricted ones are counted in `omittedRestricted`.",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "ownerAccountId": {
            "type": [
              "string",
              "null"
            ],
            "description": "A bare Atlassian accountId, never a name or an email."
          },
          "versionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "cycles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanCycle"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "closed"
            ],
            "description": "The plan's own state. A closed plan takes no change except `status: \"active\"` (reopen); everything else is `409 plan-closed`."
          },
          "revision": {
            "type": "integer",
            "minimum": 0,
            "description": "Changes with every change to the plan's details or status. Send it back as `baseRevision` to refuse overwriting a newer value of a field you did not read."
          },
          "details": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlanDetails"
              },
              {
                "type": "null"
              }
            ],
            "description": "`null` only when the details record is of a newer schema than this API can read."
          },
          "linkCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 50
          },
          "commentCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 200
          },
          "customFields": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "$ref": "#/components/schemas/PlanCustomField"
            },
            "description": "The project's active plan fields and this plan's values (API 1.8). Absent from an answer of an older version; clients ignore unknown fields."
          }
        }
      },
      "PlanListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanListItem"
            }
          }
        }
      },
      "PlanResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "item": {
            "$ref": "#/components/schemas/Plan"
          }
        },
        "examples": [
          {
            "schemaVersion": 1,
            "project": "NEX",
            "source": "kvs+jira",
            "omittedRestricted": 1,
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS",
            "item": {
              "id": "tp-0b3c6a9e-1111-4222-8333-444455556666",
              "name": "Release 4",
              "description": "",
              "ownerAccountId": null,
              "versionId": null,
              "startDate": null,
              "endDate": null,
              "createdAt": "2026-10-01T00:00:00.000Z",
              "updatedAt": "2026-10-02T00:00:00.000Z",
              "cycles": [
                {
                  "key": "NEX-16",
                  "label": "NEX-TS-4",
                  "name": "Regression",
                  "status": "In Progress",
                  "archived": false,
                  "locked": false
                }
              ],
              "status": "active",
              "revision": 3,
              "details": {
                "scope": "Checkout and payments.",
                "strategy": "",
                "riskLevel": "high",
                "riskNotes": "",
                "entryCriteria": "",
                "exitCriteria": ""
              },
              "linkCount": 2,
              "commentCount": 5,
              "customFields": [
                {
                  "id": "pf-3f9a1c2b7d10",
                  "name": "Test level",
                  "type": "radio",
                  "required": false,
                  "value": "System",
                  "choiceIds": [
                    "o4k2xz"
                  ]
                },
                {
                  "id": "pf-8a7c5e41b0d2",
                  "name": "Sign-off date",
                  "type": "date",
                  "required": false,
                  "value": "2026-11-30"
                }
              ]
            }
          }
        ]
      },
      "PlanCycleFacts": {
        "type": "object",
        "description": "One cycle's facts: progress by last executed result, the last result of each case, the Bugs linked to its runs. `ok: false` carries `skipped` instead.",
        "required": [
          "key",
          "ok"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "ok": {
            "type": "boolean"
          },
          "skipped": {
            "type": "string",
            "enum": [
              "forbidden",
              "unexpected",
              "deferred",
              "unavailable"
            ]
          },
          "progress": {
            "type": "object"
          },
          "cases": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "testCaseKey": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "executionKey": {
                  "type": "string"
                },
                "status": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "updated": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          },
          "defects": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                },
                "status": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "statusCategory": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "executionKeys": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "truncated": {
            "type": "boolean"
          },
          "displayLabels": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "PlanFactsResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "plan",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "plan": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanCycleFacts"
            }
          }
        }
      },
      "RunResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "item": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Run"
              },
              {
                "type": "object",
                "properties": {
                  "design": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "API 1.10: which design the latest run executed, from the run's permanent design record. `null` before any run started. A client must treat an unknown `line` as a branch.",
                    "properties": {
                      "line": {
                        "type": "string",
                        "enum": [
                          "main",
                          "branch"
                        ]
                      },
                      "branchId": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "branchName": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "versionNumber": {
                        "type": [
                          "integer",
                          "null"
                        ]
                      },
                      "checksum": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      },
      "Precondition": {
        "type": "object",
        "description": "A shared precondition. Its text is masked with the project's sensitive test data.",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "updatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "usageCount": {
            "type": "integer",
            "description": "Test cases that use it."
          }
        }
      },
      "PreconditionListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Precondition"
            }
          }
        }
      },
      "PreconditionResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "item": {
            "$ref": "#/components/schemas/Precondition"
          }
        }
      },
      "CaseVersion": {
        "type": "object",
        "properties": {
          "versionNumber": {
            "type": "integer"
          },
          "reason": {
            "type": "string"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": "string",
            "enum": [
              "steps",
              "unstructured",
              "checklist",
              "gherkin"
            ]
          },
          "stepCount": {
            "type": "integer"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "archivedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "CaseVersionsResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "key",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "key": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseVersion"
            }
          }
        }
      },
      "DataColumn": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "required": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "DataSetListItem": {
        "type": "object",
        "description": "A data set. The owner, the owner group and the classification reason are not returned.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "classification": {
            "type": "string",
            "enum": [
              "synthetic",
              "masked",
              "sensitive"
            ]
          },
          "consumable": {
            "type": "boolean"
          },
          "resetOnRefresh": {
            "type": "boolean"
          },
          "currentVersion": {
            "type": [
              "integer",
              "null"
            ]
          },
          "hasDraft": {
            "type": "boolean"
          },
          "needsRefresh": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "rowCount": {
            "type": "integer"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "DataSet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "classification": {
            "type": "string",
            "enum": [
              "synthetic",
              "masked",
              "sensitive"
            ]
          },
          "consumable": {
            "type": "boolean"
          },
          "resetOnRefresh": {
            "type": "boolean"
          },
          "currentVersion": {
            "type": [
              "integer",
              "null"
            ]
          },
          "hasDraft": {
            "type": "boolean"
          },
          "needsRefresh": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "rowCount": {
            "type": "integer"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "columns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataColumn"
            }
          },
          "versions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "version": {
                  "type": "integer"
                },
                "rowCount": {
                  "type": "integer"
                },
                "byteSize": {
                  "type": "integer"
                },
                "source": {
                  "type": "string"
                },
                "changeNote": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "publishedAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                }
              }
            }
          }
        }
      },
      "DataSetListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataSetListItem"
            }
          }
        }
      },
      "DataSetResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "item": {
            "$ref": "#/components/schemas/DataSet"
          }
        }
      },
      "DataSetRowsResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "dataSet",
          "version",
          "masked",
          "columns",
          "totalRows",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "dataSet": {
            "type": "string",
            "format": "uuid"
          },
          "version": {
            "type": "integer"
          },
          "masked": {
            "type": "boolean",
            "description": "true when the set is classified sensitive: every value is replaced by `[SENSITIVE_DATA_n]`, a different number for each cell."
          },
          "columns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataColumn"
            }
          },
          "totalRows": {
            "type": "integer"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "rowKey": {
                  "type": "string"
                },
                "ordinal": {
                  "type": "integer"
                },
                "values": {
                  "type": "object",
                  "description": "Keyed by column name."
                }
              }
            }
          }
        },
        "examples": [
          {
            "schemaVersion": 1,
            "project": "NEX",
            "source": "sql",
            "dataSet": "11111111-2222-4333-8444-555555555555",
            "version": 2,
            "masked": true,
            "columns": [
              {
                "name": "email",
                "type": "string",
                "required": true
              },
              {
                "name": "plan",
                "type": "string",
                "required": false
              }
            ],
            "totalRows": 2,
            "items": [
              {
                "rowKey": "r1",
                "ordinal": 0,
                "values": {
                  "email": "[SENSITIVE_DATA_1]",
                  "plan": "[SENSITIVE_DATA_2]"
                }
              },
              {
                "rowKey": "r2",
                "ordinal": 1,
                "values": {
                  "email": "[SENSITIVE_DATA_3]",
                  "plan": null
                }
              }
            ],
            "nextCursor": null,
            "omittedRestricted": 0,
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS"
          }
        ]
      },
      "DataSetRowStatesResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "dataSet",
          "consumable",
          "rowCount",
          "pools",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "dataSet": {
            "type": "string",
            "format": "uuid"
          },
          "consumable": {
            "type": "boolean"
          },
          "rowCount": {
            "type": "integer"
          },
          "pools": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "environmentId": {
                  "type": "string"
                },
                "reserved": {
                  "type": "integer"
                },
                "consumed": {
                  "type": "integer"
                }
              }
            }
          }
        }
      },
      "WriteResult": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "result",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": true,
            "description": "What the route did: usually `key` and `label`, or `id`. `partial` lists what did not apply when the item itself was written."
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          }
        },
        "examples": [
          {
            "schemaVersion": 1,
            "project": "NEX",
            "result": {
              "key": "NEX-1201",
              "label": "NEX-TC-88"
            },
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS"
          }
        ]
      },
      "BulkResult": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "summary",
          "results",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "summary": {
            "type": "object",
            "required": [
              "ok",
              "failed",
              "notAttempted",
              "idempotentHit"
            ],
            "properties": {
              "ok": {
                "type": "integer"
              },
              "failed": {
                "type": "integer"
              },
              "notAttempted": {
                "type": "integer"
              },
              "idempotentHit": {
                "type": "integer"
              }
            }
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "index",
                "status"
              ],
              "properties": {
                "index": {
                  "type": "integer"
                },
                "status": {
                  "enum": [
                    "ok",
                    "failed",
                    "not-attempted",
                    "idempotent-hit"
                  ]
                },
                "key": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "error": {
                  "type": "string"
                },
                "partial": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          }
        },
        "examples": [
          {
            "schemaVersion": 1,
            "project": "NEX",
            "summary": {
              "ok": 1,
              "failed": 1,
              "notAttempted": 0,
              "idempotentHit": 0
            },
            "results": [
              {
                "index": 0,
                "status": "ok",
                "key": "NEX-1202"
              },
              {
                "index": 1,
                "status": "failed",
                "error": "folder-not-found"
              }
            ],
            "requestId": "r_7HcAbCdEfGhIjKlMnOpQrS"
          }
        ]
      },
      "PlanDetails": {
        "type": "object",
        "description": "The built-in plan details (API 1.1). A field never set is an empty string (`riskLevel`: `null`). `textFormat` is always `md-lite` (plain text with light Markdown) and is read-only.",
        "properties": {
          "scope": {
            "type": "string",
            "maxLength": 4000,
            "description": "What the plan covers. Plain text with light Markdown; at most 4,000 characters."
          },
          "strategy": {
            "type": "string",
            "maxLength": 4000,
            "description": "How the plan will be tested."
          },
          "riskLevel": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "low",
              "medium",
              "high",
              "critical",
              null
            ]
          },
          "riskNotes": {
            "type": "string",
            "maxLength": 4000,
            "description": "Why the risk level is what it is."
          },
          "entryCriteria": {
            "type": "string",
            "maxLength": 4000,
            "description": "What must be true before testing starts."
          },
          "exitCriteria": {
            "type": "string",
            "maxLength": 4000,
            "description": "What must be true before testing may stop."
          },
          "textFormat": {
            "type": "string",
            "const": "md-lite",
            "readOnly": true
          }
        }
      },
      "PlanHistoryItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "kind": {
            "type": "string",
            "description": "Open set: `plan-created`, `core-changed`, `field-changed`, `custom-field-changed` (detail: `fieldId`, `fieldName`, `from`, `to` as text, choice labels as they were at the time), `status-changed`, `cycles-added`, `cycles-removed`, `cycle-dropped`, `cycle-rekeyed`, `link-added`, `link-removed`, `comment-added`, `comment-edited`, `comment-deleted`. A client must ignore a kind it does not know."
          },
          "source": {
            "type": "string",
            "enum": [
              "ui",
              "api",
              "system",
              "rovo",
              "import"
            ]
          },
          "actorAccountId": {
            "type": [
              "string",
              "null"
            ],
            "description": "A bare accountId; `null` for an API key or the system."
          },
          "detail": {
            "type": "object",
            "additionalProperties": true,
            "description": "Kind-specific, cut to 500 characters per value. Cycle keys of another project or of a restricted issue are removed and counted in `omittedRestricted`."
          }
        }
      },
      "PlanComment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "authorAccountId": {
            "type": [
              "string",
              "null"
            ],
            "description": "A bare accountId; `null` for a comment written through the API (shown as \"Nexus API\" in Nexus)."
          },
          "body": {
            "type": "string",
            "description": "Plain text, at most 2,000 characters."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "editedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "PlanLink": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^pl-[0-9a-f-]{36}$"
          },
          "kind": {
            "type": "string",
            "enum": [
              "issue",
              "confluence",
              "url"
            ]
          },
          "label": {
            "type": "string",
            "maxLength": 120
          },
          "addedAt": {
            "type": "string",
            "format": "date-time"
          },
          "issueKey": {
            "type": "string",
            "description": "`issue` links only."
          },
          "url": {
            "type": "string",
            "description": "`confluence` and `url` links only (http or https). Nexus never fetches it."
          },
          "host": {
            "type": "string",
            "description": "The address's host, for display."
          }
        }
      },
      "PlanHistoryResponse": {
        "type": "object",
        "description": "The change history of a plan, newest first (API 1.1).",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "plan",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "plan": {
            "type": "string"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Entries (or keys inside entries) withheld because they name an issue this key may not see."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanHistoryItem"
            }
          }
        }
      },
      "PlanCommentsResponse": {
        "type": "object",
        "description": "The comments of a plan, newest first (API 1.1).",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "plan",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "plan": {
            "type": "string"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Entries (or keys inside entries) withheld because they name an issue this key may not see."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanComment"
            }
          }
        }
      },
      "PlanLinksResponse": {
        "type": "object",
        "description": "The links of a plan (API 1.1). A work item link the key may not see is not listed.",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "plan",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "plan": {
            "type": "string"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Entries (or keys inside entries) withheld because they name an issue this key may not see."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanLink"
            }
          }
        }
      },
      "PlanLinksResult": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "result",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "result": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "linkCount": {
                "type": "integer"
              }
            }
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanLink"
            }
          },
          "refused": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Work item keys that were not added (`not-found`: not a visible, unrestricted issue of this project)."
          }
        }
      },
      "StepFieldListResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StepFieldDefinition"
            }
          }
        }
      },
      "StepFieldDefinition": {
        "type": "object",
        "required": [
          "id",
          "name",
          "type",
          "enabled",
          "required",
          "retired"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^sf-[a-z0-9]{8,32}$",
            "description": "Stable. Use it as the key of steps[].fields on a write."
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "Open list: text, number, select, checkbox, url, date, datetime, radio, multiselect, user. Treat a type you do not know as text."
          },
          "enabled": {
            "type": "boolean"
          },
          "required": {
            "type": "boolean"
          },
          "retired": {
            "type": "boolean"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "select only."
          },
          "choices": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "label",
                "retired"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "retired": {
                  "type": "boolean"
                }
              }
            },
            "description": "radio and multiselect only. A write names a choice by id."
          },
          "minDate": {
            "type": "string"
          },
          "maxDate": {
            "type": "string"
          },
          "maxSelections": {
            "type": "integer"
          },
          "candidates": {
            "type": "string",
            "enum": [
              "project",
              "assignable"
            ],
            "description": "user only: who can be picked."
          }
        }
      },
      "TypedFieldValue": {
        "type": "object",
        "required": [
          "name",
          "type",
          "value"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "number",
              "boolean",
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "PlanRuleCondition": {
        "type": "object",
        "description": "One condition. `field` is label, component, fixVersion, priority, status, folder, requirements or jql. Values are ids for component, fixVersion and priority, names for status, label and folder, issue keys for requirements.",
        "additionalProperties": false,
        "required": [
          "field"
        ],
        "properties": {
          "field": {
            "type": "string",
            "enum": [
              "label",
              "component",
              "fixVersion",
              "priority",
              "status",
              "folder",
              "requirements",
              "jql"
            ]
          },
          "op": {
            "type": "string",
            "enum": [
              "in",
              "not-in"
            ]
          },
          "values": {
            "type": "array",
            "maxItems": 50,
            "items": {
              "type": "string",
              "maxLength": 400
            }
          },
          "value": {
            "type": "string",
            "maxLength": 2000,
            "description": "The advanced JQL clause (field `jql` only). No ORDER BY."
          }
        }
      },
      "PlanRule": {
        "type": "object",
        "description": "A plan's membership rule (API 1.3): every condition must match (AND). At most 10 conditions; the compiled query is always confined to this project's Test Cases.",
        "additionalProperties": false,
        "required": [
          "conditions"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "match": {
            "type": "string",
            "enum": [
              "all"
            ]
          },
          "includeObsolete": {
            "type": "boolean",
            "default": false
          },
          "conditions": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10,
            "items": {
              "$ref": "#/components/schemas/PlanRuleCondition"
            }
          }
        }
      },
      "PlanRuleRefresh": {
        "type": [
          "object",
          "null"
        ],
        "description": "The last refresh of the members; `error` is null when it worked.",
        "properties": {
          "at": {
            "type": "string"
          },
          "memberCount": {
            "type": "integer"
          },
          "addedCount": {
            "type": "integer"
          },
          "removedCount": {
            "type": "integer"
          },
          "source": {
            "type": "string",
            "enum": [
              "open",
              "manual",
              "save",
              "api"
            ]
          },
          "error": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "too-many",
              "invalid-jql",
              "forbidden",
              "budget",
              "failed",
              null
            ]
          }
        }
      },
      "PlanRuleItem": {
        "type": "object",
        "description": "A plan's membership: `static` (cycles chosen by hand), `dynamic` (a rule computes the Test Case scope) or `unreadable` (saved by a newer version).",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "static",
              "dynamic",
              "unreadable"
            ]
          },
          "rule": {
            "$ref": "#/components/schemas/PlanRule"
          },
          "ruleText": {
            "type": "string"
          },
          "ruleRevision": {
            "type": "integer"
          },
          "frozenAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "memberCount": {
            "type": "integer"
          },
          "lastRefresh": {
            "$ref": "#/components/schemas/PlanRuleRefresh"
          }
        }
      },
      "PlanRuleResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "requestId",
          "item",
          "omittedRestricted"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "item": {
            "$ref": "#/components/schemas/PlanRuleItem"
          },
          "omittedRestricted": {
            "type": "integer"
          }
        },
        "description": "A plan's membership rule (API 1.3)."
      },
      "PlanMember": {
        "type": "object",
        "required": [
          "key",
          "summary"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": "string",
            "description": "Customer text; shown as plain text."
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "PlanMembersResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "requestId",
          "plan",
          "generation",
          "items",
          "nextCursor",
          "omittedRestricted"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "plan": {
            "type": "string"
          },
          "generation": {
            "type": "integer"
          },
          "asOf": {
            "type": [
              "string",
              "null"
            ]
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlanMember"
            }
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key, the plan and the generation; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Members withheld because this key may not see them."
          }
        },
        "description": "The cached members of a dynamic plan (API 1.3)."
      },
      "CaseFeature": {
        "type": "object",
        "required": [
          "key",
          "label",
          "kind",
          "fileName",
          "content",
          "revision",
          "masked",
          "reason",
          "folderPath",
          "status",
          "retired",
          "updated"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "kind": {
            "type": "string",
            "enum": [
              "gherkin",
              "other"
            ],
            "description": "`other`: no usable Gherkin design (classic steps, checklist, text or none). Treat an unknown value as `other`."
          },
          "fileName": {
            "type": [
              "string",
              "null"
            ],
            "description": "`<KEY>.feature`."
          },
          "content": {
            "type": [
              "string",
              "null"
            ],
            "description": "The .feature file exactly as Nexus exports it, masked. Lines end with LF."
          },
          "revision": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9a-f]{16}$",
            "description": "First 16 hex characters of SHA-256 over `content`."
          },
          "masked": {
            "type": "boolean"
          },
          "reason": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "no-gherkin",
              "invalid-gherkin",
              "too-large",
              null
            ],
            "description": "Why `content` is null."
          },
          "folderPath": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "retired": {
            "type": "boolean",
            "description": "Trashed or Obsolete (only returned with includeTrashed=true)."
          },
          "updated": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "CaseFeatureResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "item",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "op": {
            "type": "string"
          },
          "item": {
            "$ref": "#/components/schemas/CaseFeature"
          }
        }
      },
      "CaseScriptResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "key",
          "item",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "op": {
            "type": "string"
          },
          "item": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CaseScript"
              },
              {
                "type": "null"
              }
            ]
          },
          "key": {
            "type": "string",
            "description": "The test case key asked for."
          }
        }
      },
      "CaseScript": {
        "type": "object",
        "description": "A test case's current Playwright script (text, never run by Nexus).",
        "required": [
          "automationKey",
          "version",
          "fileName",
          "sha256",
          "bytes",
          "verified",
          "masked",
          "code",
          "createdAt",
          "warnings",
          "versions",
          "status",
          "approvedSha256",
          "approvedBy",
          "approvedAt",
          "reviewUrl"
        ],
        "properties": {
          "automationKey": {
            "type": "string",
            "description": "The key the test title starts with, so results map to the case."
          },
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "fileName": {
            "type": "string"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$",
            "description": "SHA-256 of the stored copy (before masking)."
          },
          "bytes": {
            "type": "integer",
            "minimum": 1
          },
          "verified": {
            "type": "boolean",
            "description": "The stored copy matches its checksum. When false, `code` is null."
          },
          "masked": {
            "type": "boolean",
            "description": "Masking changed the returned code; do not compare it with `sha256`."
          },
          "code": {
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "warnings": {
            "type": "array",
            "description": "Things to check before running it. A client must ignore a code it does not know.",
            "items": {
              "type": "object",
              "required": [
                "code",
                "line"
              ],
              "properties": {
                "code": {
                  "type": "string"
                },
                "line": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            }
          },
          "versions": {
            "type": "array",
            "description": "The versions kept (at most 5), newest first.",
            "items": {
              "type": "object",
              "required": [
                "version",
                "sha256",
                "bytes",
                "createdAt"
              ],
              "properties": {
                "version": {
                  "type": "integer",
                  "minimum": 1
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "bytes": {
                  "type": "integer"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "reviewed",
              "approved"
            ],
            "description": "Added in 1.9. The review state of this version. `approved` only while the approval is bound to this exact checksum; a new version is `draft`. A runner must run nothing but `approved` with `approvedSha256` equal to `sha256` and to the SHA-256 of `code`. A client must treat an unknown value as not approved."
          },
          "approvedSha256": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9a-f]{64}$",
            "description": "Added in 1.9. The checksum the approval is bound to; null unless `status` is `approved`."
          },
          "approvedBy": {
            "type": "null",
            "description": "Added in 1.9. Always null: no account ids leave Nexus; the approver is in the case history in Nexus."
          },
          "approvedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Added in 1.9. When the current version was approved; null unless approved."
          },
          "reviewUrl": {
            "type": "string",
            "description": "Added in 1.9. Where a person reviews and approves the script, relative to the Jira site (`browse/<KEY>`, Automation tab)."
          }
        }
      },
      "PlanCustomField": {
        "type": "object",
        "description": "One of the project's admin-defined plan fields with this plan's value (API 1.8). Fields are defined in Project settings > Plan fields; only active, turned-on fields are listed. `value` is `null` when not set (a checkbox is `false`). A radio value is the choice label, a multi-select value an array of labels; `choiceIds` holds the matching stable choice ids in the same order. Dates are `YYYY-MM-DD` (date) and a UTC instant at whole minutes (datetime). Text is plain text, never markup.",
        "required": [
          "id",
          "name",
          "type",
          "required",
          "value"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^pf-[a-z0-9]{8,32}$",
            "description": "The stable field id. Renaming a field keeps it."
          },
          "name": {
            "type": "string",
            "maxLength": 40
          },
          "type": {
            "type": "string",
            "enum": [
              "text",
              "textarea",
              "number",
              "checkbox",
              "date",
              "datetime",
              "radio",
              "multiselect"
            ]
          },
          "required": {
            "type": "boolean",
            "description": "A required field can not be cleared once set. It never blocks a change to another field."
          },
          "value": {
            "oneOf": [
              {
                "type": "string",
                "maxLength": 2000
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 80
                },
                "maxItems": 20
              },
              {
                "type": "null"
              }
            ]
          },
          "choiceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^o[a-z0-9]{5}$"
            },
            "maxItems": 20,
            "description": "Radio and multi-select only."
          }
        }
      },
      "CaseBranch": {
        "type": "object",
        "required": [
          "id",
          "name",
          "status",
          "releaseVersionId",
          "releaseTag",
          "baseVersionNumber",
          "stepCount",
          "locked",
          "revision",
          "createdAt",
          "updatedAt",
          "archivedAt"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "description": "draft, ready or archived. A client must treat an unknown value as archived (not runnable)."
          },
          "releaseVersionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "releaseTag": {
            "type": [
              "string",
              "null"
            ]
          },
          "baseVersionNumber": {
            "type": [
              "integer",
              "null"
            ]
          },
          "stepCount": {
            "type": "integer"
          },
          "locked": {
            "type": "boolean"
          },
          "revision": {
            "type": "integer"
          },
          "createdAt": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string"
          },
          "archivedAt": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "CaseBranchesResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "key",
          "items",
          "nextCursor",
          "omittedRestricted",
          "requestId"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Opaque, signed, bound to this key; follow until null. Expires after 24 hours."
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "key": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseBranch"
            }
          }
        }
      },
      "CaseBranchResponse": {
        "type": "object",
        "required": [
          "schemaVersion",
          "project",
          "source",
          "key",
          "omittedRestricted",
          "requestId",
          "item"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "project": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "sql",
              "jira",
              "sql+jira",
              "kvs",
              "kvs+jira"
            ]
          },
          "requestId": {
            "$ref": "#/components/schemas/RequestId"
          },
          "omittedRestricted": {
            "type": "integer",
            "description": "Records withheld because they carry a Jira issue-security level."
          },
          "asOf": {
            "type": "string",
            "format": "date-time",
            "description": "When the SQL mirror was last caught up with Jira."
          },
          "partial": {
            "type": "boolean",
            "description": "Some fields were left out because Jira was being conserved."
          },
          "key": {
            "type": "string"
          },
          "item": {
            "type": "object",
            "required": [
              "id",
              "name",
              "status",
              "releaseVersionId",
              "releaseTag",
              "baseVersionNumber",
              "stepCount",
              "locked",
              "revision",
              "createdAt",
              "updatedAt",
              "archivedAt",
              "readable",
              "kind",
              "checksum",
              "design"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "description": "draft, ready or archived. A client must treat an unknown value as archived (not runnable)."
              },
              "releaseVersionId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "releaseTag": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "baseVersionNumber": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "stepCount": {
                "type": "integer"
              },
              "locked": {
                "type": "boolean"
              },
              "revision": {
                "type": "integer"
              },
              "createdAt": {
                "type": "string"
              },
              "updatedAt": {
                "type": "string"
              },
              "archivedAt": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "readable": {
                "type": "boolean"
              },
              "kind": {
                "type": "string"
              },
              "checksum": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "design": {
                "type": [
                  "object",
                  "null"
                ]
              }
            }
          }
        }
      }
    }
  }
}
