{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "MT backend REST API documentation",
    "description" : "Documentation of the 2c8 MT backend service.",
    "contact" : {
      "name" : "2c8 Business Solutions AB",
      "url" : "https://www.2c8.com",
      "email" : "support@2c8.com"
    },
    "version" : "1.0.0"
  },
  "servers" : [ {
    "url" : "https://your-server.example/mt-backend",
    "description" : "Example address; replace with your own 2c8 server"
  } ],
  "security" : [ {
    "apiKeyAuth" : [ ]
  } ],
  "paths" : {
    "/api/v1/repositories/{repositoryId}/models/{modelId}/versions/accept" : {
      "post" : {
        "tags" : [ "Models" ],
        "summary" : "Accept a draft model",
        "description" : "Import a NEW draft from the draft repository into a target repository and archive the source draft. The request body `group` and the `2c8-Permission-Group` header use customer-group UUIDs. If both are provided, the request body `group` takes precedence. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
        "operationId" : "acceptDraftModel",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The repository UUID, or the case-insensitive draft repository alias `draft`.",
          "required" : true,
          "schema" : {
            "pattern" : "([0-9a-fA-F\\-]{36}|(?i:DRAFT))",
            "type" : "string"
          }
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "2c8-Permission-Group",
          "in" : "header",
          "description" : "Optional customer-group UUID used as permission-group selector when the request body does not provide `group`. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDraftAcceptDto"
              }
            }
          }
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbModelDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/accessors" : {
      "get" : {
        "tags" : [ "Accessors" ],
        "summary" : "List accessors",
        "description" : "Retrieve all accessors for a repository. An accessor can be a user or a group.",
        "operationId" : "getRepositoryAccessors",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `groupEntity`, `groupEntity.group`, `privileges`, `type`, `user`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "groupEntity", "groupEntity.group", "privileges", "type", "user", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `groupEntity.group`, `privileges`, `type`, `user`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "groupEntity.group", "privileges", "type", "user", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `groupEntity`, `groupEntity.group`, `type`, `user`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `groupEntity`, `groupEntity.group`, `type`, `user`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "groupEntity", "groupEntity.group", "type", "user", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AccessorPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "86403a1a-271a-432f-b866-434efaf9cd56",
                    "type" : "user",
                    "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "privileges" : {
                      "throwOut" : true,
                      "languageEdit" : true,
                      "editApproved" : false,
                      "lockPrefix" : false,
                      "exportData" : true,
                      "manageUsers" : true,
                      "manageLayers" : true,
                      "snapshotCreate" : true,
                      "publish" : true,
                      "manageWorkflow" : true,
                      "snapshotLock" : true,
                      "manageLists" : true,
                      "None" : false,
                      "manageFields" : true
                    }
                  }, {
                    "uuid" : "e8a0a93d-4093-44e5-9885-2e655186810a",
                    "type" : "user",
                    "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "privileges" : {
                      "throwOut" : false,
                      "languageEdit" : true,
                      "editApproved" : false,
                      "lockPrefix" : false,
                      "exportData" : true,
                      "manageUsers" : true,
                      "manageLayers" : true,
                      "snapshotCreate" : false,
                      "publish" : true,
                      "manageWorkflow" : true,
                      "snapshotLock" : true,
                      "manageLists" : true,
                      "None" : false,
                      "manageFields" : true
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Accessors" ],
        "summary" : "Create an accessor",
        "description" : "Create a new accessor for a repository. An accessor can be a user or a group.",
        "operationId" : "createRepositoryAccessor",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "MtbAccessorDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbAccessorDto"
              },
              "examples" : {
                "Default" : {
                  "summary" : "Create repository accessor",
                  "description" : "Full payload for creating a USER accessor with privileges.",
                  "value" : {
                    "type" : "user",
                    "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "privileges" : {
                      "throwOut" : false,
                      "snapshotLock" : true,
                      "languageEdit" : true,
                      "snapshotCreate" : false,
                      "manageUsers" : true,
                      "manageLayers" : true,
                      "manageLists" : true,
                      "exportData" : true,
                      "publish" : true,
                      "manageFields" : true,
                      "lockPrefix" : false,
                      "manageWorkflow" : true,
                      "editApproved" : false
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbAccessorDto"
                },
                "example" : {
                  "uuid" : "e8a0a93d-4093-44e5-9885-2e655186810a",
                  "type" : "user",
                  "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "privileges" : {
                    "throwOut" : false,
                    "snapshotLock" : true,
                    "languageEdit" : true,
                    "snapshotCreate" : false,
                    "manageUsers" : true,
                    "manageLayers" : true,
                    "manageLists" : true,
                    "exportData" : true,
                    "publish" : true,
                    "manageFields" : true,
                    "lockPrefix" : false,
                    "manageWorkflow" : true,
                    "editApproved" : false
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/accessors/{accessorId}" : {
      "get" : {
        "tags" : [ "Accessors" ],
        "summary" : "Get an accessor",
        "description" : "Retrieve a specific accessor for a repository. An accessor can be a user or a group.",
        "operationId" : "getRepositoryAccessor",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "accessorId",
          "in" : "path",
          "description" : "The UUID of the accessor.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "b14c3315-ee5f-4d25-82a5-5a88551b071e"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `groupEntity`, `groupEntity.group`, `privileges`, `type`, `user`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "groupEntity", "groupEntity.group", "privileges", "type", "user", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AccessorView"
                },
                "examples" : {
                  "Example Response" : {
                    "summary" : "An example response containing a list of accessors for a repository",
                    "description" : "Example Response",
                    "value" : {
                      "uuid" : "e8a0a93d-4093-44e5-9885-2e655186810a",
                      "type" : "user",
                      "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                      "privileges" : {
                        "throwOut" : false,
                        "languageEdit" : true,
                        "editApproved" : false,
                        "lockPrefix" : false,
                        "exportData" : true,
                        "manageUsers" : true,
                        "manageLayers" : true,
                        "snapshotCreate" : false,
                        "publish" : true,
                        "manageWorkflow" : true,
                        "snapshotLock" : true,
                        "manageLists" : true,
                        "None" : false,
                        "manageFields" : true
                      }
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Accessors" ],
        "summary" : "Delete an accessor",
        "description" : "Delete an existing accessor for a repository. An accessor can be a user or a group.",
        "operationId" : "deleteRepositoryAccessor",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "accessorId",
          "in" : "path",
          "description" : "The UUID of the accessor.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Accessors" ],
        "summary" : "Update an accessor",
        "description" : "Update an existing accessor for a repository. An accessor can be a user or a group.",
        "operationId" : "updateRepositoryAccessor",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "accessorId",
          "in" : "path",
          "description" : "The UUID of the accessor.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "b14c3315-ee5f-4d25-82a5-5a88551b071e"
        } ],
        "requestBody" : {
          "description" : "MtbAccessorDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbAccessorDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "privileges" : {
                      "throwOut" : false,
                      "snapshotLock" : true,
                      "languageEdit" : true,
                      "snapshotCreate" : false,
                      "manageUsers" : true,
                      "manageLayers" : true,
                      "manageLists" : true,
                      "exportData" : true,
                      "publish" : true,
                      "manageFields" : true,
                      "lockPrefix" : false,
                      "manageWorkflow" : true,
                      "editApproved" : false
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/api-keys" : {
      "get" : {
        "tags" : [ "API keys" ],
        "summary" : "List API keys",
        "description" : "Retrieve API-key metadata. Requires administrator authentication; application API keys cannot call this endpoint. Secret key values are not returned.",
        "operationId" : "getApiKeys",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `applicationName`, `createdAt`, `expiresAt`, `status`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "applicationName", "createdAt", "expiresAt", "status", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `applicationName`, `createdAt`, `expiresAt`, `status`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "applicationName", "createdAt", "expiresAt", "status", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `applicationName`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `applicationName`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "applicationName", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiKeyPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 3,
                  "data" : [ {
                    "uuid" : "d0c95674-837a-4acb-929e-bf3ac7f28a3f",
                    "applicationName" : "ad",
                    "createdAt" : "2026-02-03T13:16:58Z",
                    "expiresAt" : "2027-02-03T00:00:00Z",
                    "status" : "ACTIVE"
                  }, {
                    "uuid" : "9638fd74-384d-469e-a75f-59b215ac356c",
                    "applicationName" : "da",
                    "createdAt" : "2026-02-03T13:16:58Z",
                    "expiresAt" : "2027-02-03T00:00:00Z",
                    "status" : "ACTIVE"
                  }, {
                    "uuid" : "9d9e880b-64dc-4067-80df-759d8d5c7e82",
                    "applicationName" : "application - 1",
                    "createdAt" : "2026-02-20T02:41:15Z",
                    "expiresAt" : "2027-02-03T00:00:00Z",
                    "status" : "ACTIVE"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "API keys" ],
        "summary" : "Create an API key",
        "description" : "Create an API key.",
        "operationId" : "createApiKey",
        "requestBody" : {
          "description" : "MtbApiKeyDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbApiKeyDto"
              },
              "examples" : {
                "Example API key" : {
                  "description" : "Example API key",
                  "value" : {
                    "applicationName" : "Name of API key",
                    "expiresAt" : "2027-02-03T00:00:00Z"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbApiKeyDto"
                },
                "example" : {
                  "uuid" : "9d9e880b-64dc-4067-80df-759d8d5c7e82",
                  "applicationName" : "application - 1",
                  "apiKey" : "wOseaCx6CaYMc2kC2_fpoN9jufGujBQw5JaBTINGWkDF15mOkC3cMiN1UU1t6SqaJcillBEeqgVHoTMku92jvQ",
                  "expiresAt" : "2027-02-03T00:00:00Z",
                  "createdAt" : "2026-02-20T02:41:15Z",
                  "status" : "ACTIVE"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/api-keys/{apiKeyId}" : {
      "get" : {
        "tags" : [ "API keys" ],
        "summary" : "Get an API key",
        "description" : "Retrieve a specific API key.",
        "operationId" : "getApiKey",
        "parameters" : [ {
          "name" : "apiKeyId",
          "in" : "path",
          "description" : "The UUID of the API key.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "0b2d7f07-6f4f-410e-82a6-69b97faf9c86"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `applicationName`, `createdAt`, `expiresAt`, `status`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "applicationName", "createdAt", "expiresAt", "status", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiKeyView"
                },
                "example" : {
                  "uuid" : "9d9e880b-64dc-4067-80df-759d8d5c7e82",
                  "applicationName" : "application - 1",
                  "createdAt" : "2026-02-20T02:41:15Z",
                  "expiresAt" : "2027-02-03T00:00:00Z",
                  "status" : "ACTIVE"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "API keys" ],
        "summary" : "Delete an API key",
        "description" : "Delete the API key with the provided uuid.",
        "operationId" : "deleteApiKey",
        "parameters" : [ {
          "name" : "apiKeyId",
          "in" : "path",
          "description" : "The UUID of the API key.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c8114124-03ff-476a-a2dd-220431be4097"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "API keys" ],
        "summary" : "Update an API key",
        "description" : "Update the status and/or applicationName of an API key.",
        "operationId" : "updateApiKey",
        "parameters" : [ {
          "name" : "apiKeyId",
          "in" : "path",
          "description" : "The UUID of the API key.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c8114124-03ff-476a-a2dd-220431be4097"
        } ],
        "requestBody" : {
          "description" : "MtbApiKeyDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbApiKeyDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "applicationName" : "Name of API key",
                    "status" : "ACTIVE"
                  }
                },
                "Update application name only" : {
                  "description" : "Update application name only",
                  "value" : {
                    "applicationName" : "Name 2 of API key"
                  }
                },
                "Update status only" : {
                  "description" : "Update status only",
                  "value" : {
                    "status" : "SUSPENDED"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A success message.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/broken-down-from" : {
      "get" : {
        "tags" : [ "Breakdowns" ],
        "summary" : "List breakdowns",
        "description" : "Retrieve all breakdowns for a repository and model. A breakdown can be from an edge or a symbol.",
        "operationId" : "getBrokenDownFrom",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `edge`, `edge.model`, `edge.model.uuid`, `edge.model.version`, `edge.uuid`, `symbol`, `symbol.uuid`, `symbol.version`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "edge", "edge.model", "edge.model.uuid", "edge.model.version", "edge.uuid", "symbol", "symbol.uuid", "symbol.version", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `edge.model.uuid`, `edge.model.version`, `edge.uuid`, `symbol.uuid`, `symbol.version`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "edge.model.uuid", "edge.model.version", "edge.uuid", "symbol.uuid", "symbol.version", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `edge`, `edge.model`, `edge.model.uuid`, `edge.uuid`, `symbol`, `symbol.uuid`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `edge`, `edge.model`, `edge.model.uuid`, `edge.uuid`, `symbol`, `symbol.uuid`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "edge", "edge.model", "edge.model.uuid", "edge.uuid", "symbol", "symbol.uuid", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/BreakdownPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "b517372b-4fe6-477b-9a22-347093a44662",
                    "symbol" : {
                      "version" : 0,
                      "uuid" : "10329ba6-3216-4da0-8f6a-f28eea9c8fe8"
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Breakdowns" ],
        "summary" : "Create a breakdown",
        "description" : "Create a breakdown with the provided values",
        "operationId" : "postBrokenDownFrom",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        } ],
        "requestBody" : {
          "description" : "MtbBreakdownDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbBreakdownWriteDto"
              },
              "examples" : {
                "Create break down from symbol" : {
                  "summary" : "Create from symbol",
                  "description" : "Creates a breakdown linked to a symbol UUID.",
                  "value" : {
                    "symbol" : "b929eaba-0f66-45d1-8f0a-aee33e559b55"
                  }
                },
                "Create break down from edge" : {
                  "summary" : "Create from edge",
                  "description" : "Creates a breakdown linked to an edge UUID.",
                  "value" : {
                    "edge" : "b929eaba-0f66-45d1-8f0a-aee33e559b55"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbBreakdownReadDto"
                },
                "example" : {
                  "uuid" : "b517372b-4fe6-477b-9a22-347093a44662",
                  "symbol" : {
                    "uuid" : "10329ba6-3216-4da0-8f6a-f28eea9c8fe8",
                    "version" : 0
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "409" : {
            "description" : "There is a resource conflict. A resource may be locked or already exist."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/broken-down-from/{breakdownId}" : {
      "delete" : {
        "tags" : [ "Breakdowns" ],
        "summary" : "Delete a breakdown",
        "description" : "Delete the breakdown with the provided uuid",
        "operationId" : "deleteBrokenDownFrom",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        }, {
          "name" : "breakdownId",
          "in" : "path",
          "description" : "The UUID of the breakdown.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e76e9aec-4f22-442a-a0eb-f24985e0c231"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "409" : {
            "description" : "There is a resource conflict. A resource may be locked or already exist."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/canvas" : {
      "get" : {
        "tags" : [ "Canvas" ],
        "summary" : "Get the canvas for a model",
        "description" : "Retrieve the canvas for a model.",
        "operationId" : "getCanvas",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbCanvasDto"
                },
                "examples" : {
                  "SingleVertexSingleEdge" : {
                    "summary" : "Example canvas with one vertex and one edge",
                    "description" : "SingleVertexSingleEdge",
                    "value" : {
                      "workflowState" : "EDITABLE",
                      "vertices" : [ {
                        "uuid" : "baa2e42e-0b41-408d-a987-c5f93166cac4",
                        "x" : 209,
                        "y" : 296,
                        "width" : 18,
                        "height" : 18,
                        "zOrder" : 0,
                        "accessLevel" : "WRITE",
                        "versionLocked" : false,
                        "sizeRatio" : 1.5,
                        "lockProportions" : false,
                        "labels" : {
                          "728dedf3-a9d9-4c10-b05f-bc6e998e7342" : {
                            "title" : "Need to be creative",
                            "rawTitle" : "Need to be creative",
                            "x" : 191,
                            "y" : 317,
                            "width" : 54,
                            "height" : 28,
                            "translated" : false
                          },
                          "edca87aa-4f92-459b-bb6f-a0136149e7c0" : {
                            "title" : "Need to be creative",
                            "rawTitle" : "Need to be creative",
                            "x" : 191,
                            "y" : 317,
                            "width" : 54,
                            "height" : 28
                          }
                        },
                        "centerLabel" : false,
                        "labelTextFont" : "Arial",
                        "labelTextSize" : 11,
                        "labelTextStyle" : "PLAIN",
                        "labelTextColor" : "#2F5410",
                        "manualLabelColor" : false,
                        "showLabel" : true,
                        "image" : "/api/v1/icons/factory.png?size=48",
                        "border" : null,
                        "color" : null,
                        "manualColor" : false,
                        "locked" : false,
                        "layer" : null,
                        "holder" : false,
                        "owningDataObject" : true,
                        "breakdowns" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151", "fdc105cf-ab42-49cf-9f48-0a7310a37a9f" ],
                        "hasInformation" : false,
                        "hasDocument" : false,
                        "symbol" : "f2d2ee19-1582-4399-ab55-49b8c9ae1197",
                        "objectType" : "BUSINESS_OBJECT",
                        "prefix" : null,
                        "alternativeSymbol" : null,
                        "properties" : null
                      } ],
                      "edges" : [ {
                        "uuid" : "83091817-805f-4b1d-bf95-d87f94a89f4f",
                        "breakdowns" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151", "fdc105cf-ab42-49cf-9f48-0a7310a37a9f" ],
                        "labels" : {
                          "728dedf3-a9d9-4c10-b05f-bc6e998e7342" : {
                            "title" : "",
                            "rawTitle" : "",
                            "x" : 227,
                            "y" : 305,
                            "width" : 40,
                            "height" : 20,
                            "translated" : false
                          },
                          "edca87aa-4f92-459b-bb6f-a0136149e7c0" : {
                            "title" : "",
                            "rawTitle" : "",
                            "x" : 227,
                            "y" : 305,
                            "width" : 40,
                            "height" : 20
                          }
                        },
                        "points" : [ {
                          "x" : 227,
                          "y" : 305
                        }, {
                          "x" : 267,
                          "y" : 305
                        } ],
                        "edgeType" : "FLOW",
                        "router" : "se.conciliate.mt.router.def.router",
                        "hideArrow" : false,
                        "labelTextFont" : "Arial",
                        "labelTextSize" : 11,
                        "labelTextStyle" : "PLAIN",
                        "labelTextColor" : "#000000",
                        "manualLabelColor" : false,
                        "stroke" : {
                          "dashPattern" : [ 1.5, 4.5 ],
                          "width" : 1.75,
                          "color" : {
                            "space" : "SRGB",
                            "red" : 251,
                            "green" : 144,
                            "blue" : 10,
                            "hexRepresentation" : "#FB900A"
                          }
                        },
                        "toVertex" : "9be93a23-d344-4e36-b025-0123d77e8b11",
                        "fromVertex" : "baa2e42e-0b41-408d-a987-c5f93166cac4",
                        "rotateLabel" : false
                      } ],
                      "layerZOrder" : [ "2b56b27e-d2b3-4c2f-928a-2331fff28d6b", "79f3610c-d2a1-49cc-97f0-55940f939e5f" ],
                      "swimlaneSettings" : null
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Canvas" ],
        "summary" : "Partially update the canvas for a model",
        "description" : "Update vertices and edges on the canvas for a model.",
        "operationId" : "updateCanvas",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        } ],
        "requestBody" : {
          "description" : "Canvas patch payload.\nOnly fields documented as writable for PATCH /canvas are accepted.\n",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbCanvasDto"
              },
              "examples" : {
                "MoveVertex" : {
                  "summary" : "Move a single vertex",
                  "description" : "MoveVertex",
                  "value" : {
                    "vertices" : [ {
                      "uuid" : "baa2e42e-0b41-408d-a987-c5f93166cac4",
                      "x" : 240,
                      "y" : 312,
                      "width" : 18,
                      "height" : 18,
                      "zOrder" : 0,
                      "breakdowns" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151" ]
                    } ]
                  }
                },
                "UpdateEdgePoints" : {
                  "summary" : "Update edge routing points",
                  "description" : "UpdateEdgePoints",
                  "value" : {
                    "edges" : [ {
                      "uuid" : "83091817-805f-4b1d-bf95-d87f94a89f4f",
                      "labels" : {
                        "728dedf3-a9d9-4c10-b05f-bc6e998e7342" : {
                          "x" : 226,
                          "y" : 302,
                          "width" : 40,
                          "height" : 20
                        },
                        "edca87aa-4f92-459b-bb6f-a0136149e7c0" : {
                          "x" : 226,
                          "y" : 302,
                          "width" : 40,
                          "height" : 20
                        }
                      },
                      "points" : [ {
                        "x" : 220,
                        "y" : 300
                      }, {
                        "x" : 260,
                        "y" : 300
                      } ],
                      "breakdowns" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151" ]
                    } ]
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/color-schemes/{colorSchemeId}" : {
      "get" : {
        "tags" : [ "Color schemes" ],
        "summary" : "Get a color scheme",
        "description" : "Retrieve a specific color scheme",
        "operationId" : "getColorScheme",
        "parameters" : [ {
          "name" : "colorSchemeId",
          "in" : "path",
          "description" : "The UUID of the color scheme.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d46070f8-4e55-4c4b-bd61-8e6b5b45e94b"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `default`, `title`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "default", "title", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ColorSchemeView"
                },
                "example" : {
                  "uuid" : "0260e58f-0dae-4126-b3ee-11a1228231c0",
                  "title" : "CS_01",
                  "default" : false,
                  "content" : {
                    "symbol" : null,
                    "border" : [ {
                      "key" : "INDIVIDUAL_UNISEX",
                      "style" : "009292:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "ORGANISATION_ORGANISATION",
                      "style" : "efb70f:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "PROCESS_PROCESS",
                      "style" : "cecabf:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "APPLICATION_COLLABORATION_APPLICATION_COLLABORATION",
                      "style" : "787876:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "WEAKNESS_WEAKNESS",
                      "style" : "8f2f23:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "INDIVIDUAL_MAN",
                      "style" : "009292:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "RISK_RISK",
                      "style" : "8f2f23:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "LOCATION_LOCATION",
                      "style" : "007981:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "ACTIVITY_ACTIVITY",
                      "style" : "5db2bd:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "ADAPTATION_ADAPTATION",
                      "style" : "787876:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "ARCHIVE_ARCHIVE",
                      "style" : "cecabf:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "REQUIREMENT_REQUIREMENT",
                      "style" : "efb70f:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "INDICATOR_GAUGE",
                      "style" : "78787c:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "APPLICATION_COMPONENT_APPLICATION_COMPONENT",
                      "style" : "787876:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "INTERESTED_PARTY_INTERESTED_PARTY",
                      "style" : "ff9326:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "DECISION_AND",
                      "style" : "49adb8:1.0:1:1:1.0:0.0:"
                    }, {
                      "key" : "APPLICATION_APPLICATION",
                      "style" : "787876:1.0:1:1:1.0:0.0:"
                    } ],
                    "relation-stroke" : [ {
                      "key" : "RACI_ACCOUNTABLE",
                      "style" : "d25949:null"
                    }, {
                      "key" : "BPMN_ASSOCIATION",
                      "style" : "787876:null"
                    }, {
                      "key" : "BPMN_MESSAGE_FLOW",
                      "style" : "787876:null"
                    }, {
                      "key" : "RACI_RESPONSIBLE",
                      "style" : "2cadb2:null"
                    }, {
                      "key" : "BELONGS_TO",
                      "style" : "787876:null"
                    }, {
                      "key" : "IS_A_PART_OF",
                      "style" : "d25949:null"
                    }, {
                      "key" : "REQUIRES",
                      "style" : "ff9326:null"
                    }, {
                      "key" : "DEFINES",
                      "style" : "787876:null"
                    }, {
                      "key" : "IS_SITUATED_AT",
                      "style" : "787876:null"
                    }, {
                      "key" : "ONE_TO_ONE",
                      "style" : "787876:null"
                    }, {
                      "key" : "IS_A_KIND_OF",
                      "style" : "787876:null"
                    }, {
                      "key" : "IS_EMPOWERED",
                      "style" : "d25949:null"
                    }, {
                      "key" : "IS_USED_BY",
                      "style" : "ff9326:null"
                    }, {
                      "key" : "CAN_PLAY",
                      "style" : "ff9326:null"
                    }, {
                      "key" : "HANDLES",
                      "style" : "787876:null"
                    } ],
                    "plugin-friendly" : true
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/color-schemes" : {
      "get" : {
        "tags" : [ "Color schemes" ],
        "summary" : "List color schemes",
        "description" : "Retrieve all color schemes",
        "operationId" : "getColorSchemes",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `default`, `title`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "default", "title", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `content`, `default`, `title`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "default", "title", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `content`, `title`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `content`, `title`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "title", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ColorSchemePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "0260e58f-0dae-4126-b3ee-11a1228231c0",
                    "title" : "CS_01",
                    "default" : false,
                    "content" : {
                      "symbol" : null,
                      "border" : [ {
                        "key" : "INDIVIDUAL_UNISEX",
                        "style" : "009292:1.0:1:1:1.0:0.0:"
                      }, {
                        "key" : "ORGANISATION_ORGANISATION",
                        "style" : "efb70f:1.0:1:1:1.0:0.0:"
                      }, {
                        "key" : "PROCESS_PROCESS",
                        "style" : "cecabf:1.0:1:1:1.0:0.0:"
                      }, {
                        "key" : "JOIN_JOIN",
                        "style" : "49adb8:1.0:1:1:1.0:0.0:"
                      }, {
                        "key" : "FORUM_FORUM",
                        "style" : "cecabf:1.0:1:1:1.0:0.0:"
                      }, {
                        "key" : "ROLE_ROLE",
                        "style" : "bc5e00:1.0:1:1:1.0:0.0:"
                      }, {
                        "key" : "POSSIBILITY_POSSIBILITY",
                        "style" : "8f2f23:1.0:1:1:1.0:0.0:"
                      } ],
                      "relation-stroke" : [ {
                        "key" : "RACI_ACCOUNTABLE",
                        "style" : "d25949:null"
                      }, {
                        "key" : "TRIGGER",
                        "style" : "787876:null"
                      }, {
                        "key" : "MANY_TO_MANY",
                        "style" : "787876:null"
                      }, {
                        "key" : "IS_USED_BY",
                        "style" : "ff9326:null"
                      }, {
                        "key" : "CAN_PLAY",
                        "style" : "ff9326:null"
                      }, {
                        "key" : "HANDLES",
                        "style" : "787876:null"
                      } ],
                      "plugin-friendly" : true
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/configuration-templates" : {
      "get" : {
        "tags" : [ "Configuration templates" ],
        "summary" : "List configuration templates",
        "description" : "Retrieve all configuration templates.",
        "operationId" : "getConfigurationTemplates",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `config`, `id`, `title`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "config", "id", "title", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `config`, `id`, `title`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "config", "id", "title", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `config`, `title`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `config`, `title`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "config", "title", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ConfigurationTemplatePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "id" : 1,
                    "title" : "config-tempalte",
                    "config" : {
                      "name" : " config 1"
                    },
                    "uuid" : "cb8c61ed-c0f0-4a43-b2c7-bb74a51d5b26"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/configuration-templates/{configurationTemplateId}" : {
      "get" : {
        "tags" : [ "Configuration templates" ],
        "summary" : "Get a configuration template",
        "description" : "Retrieve a specific configuration template.",
        "operationId" : "getConfigurationTemplate",
        "parameters" : [ {
          "name" : "configurationTemplateId",
          "in" : "path",
          "description" : "The UUID of the configuration template.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "013722de-7105-47ae-ac4c-3bc544a53bee"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `config`, `id`, `title`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "config", "id", "title", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ConfigurationTemplateView"
                },
                "example" : {
                  "id" : 1,
                  "title" : "config-tempalte",
                  "config" : {
                    "name" : " config 1"
                  },
                  "uuid" : "cb8c61ed-c0f0-4a43-b2c7-bb74a51d5b26"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/description-types" : {
      "get" : {
        "tags" : [ "Description types" ],
        "summary" : "List description types",
        "description" : "Retrieve all description types for a repository.",
        "operationId" : "getDescriptionTypes",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `connectedTo`, `connectedTo.hidden`, `connectedTo.position`, `connectedTo.type`, `dataType`, `icon`, `inputType`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.refinement`, `titles.summary`, `titles.title`, `titles.translated`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "connectedTo", "connectedTo.hidden", "connectedTo.position", "connectedTo.type", "dataType", "icon", "inputType", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.refinement", "titles.summary", "titles.title", "titles.translated", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `dataType`, `icon`, `inputType`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "dataType", "icon", "inputType", "uuid", "titles.title" ],
          "x-2c8-localized-sort-values" : [ "titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `connectedTo`, `connectedTo.hidden`, `connectedTo.type`, `dataType`, `icon`, `inputType`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.refinement`, `titles.summary`, `titles.title`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `connectedTo`, `connectedTo.hidden`, `connectedTo.type`, `dataType`, `icon`, `inputType`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.refinement`, `titles.summary`, `titles.title`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "connectedTo", "connectedTo.hidden", "connectedTo.type", "dataType", "icon", "inputType", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.refinement", "titles.summary", "titles.title", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DescriptionTypePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "b636bd50-40b2-4d47-89d6-a7b4b1e849bf",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Description"
                      }
                    },
                    "dataType" : "se.conciliate.rich.text",
                    "inputType" : "rich-text-editor",
                    "icon" : "/api/v1/icons/document_notebook.png?size=16",
                    "connectedTo" : [ ]
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Description types" ],
        "summary" : "Create a description type",
        "description" : "Create description type for a repository",
        "operationId" : "createDescriptionType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "MtbDescriptionTypeDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDescriptionTypeDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "titles" : {
                      "lang1-uuid" : {
                        "title" : "example title"
                      }
                    },
                    "dataType" : "se.conciliate.rich.text",
                    "inputType" : "rich-text-editor",
                    "connectedTo" : [ {
                      "type" : "MODEL",
                      "position" : 2,
                      "hidden" : ""
                    } ]
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDescriptionTypeDto"
                },
                "examples" : {
                  "description type" : {
                    "description" : "description type",
                    "value" : {
                      "startAt" : 0,
                      "maxResults" : 10,
                      "total" : 1,
                      "data" : [ {
                        "uuid" : "b636bd50-40b2-4d47-89d6-a7b4b1e849bf",
                        "descriptionType" : "bd896b28-e40f-48bb-af24-5228c9fc6a1c",
                        "content" : {
                          "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                            "text" : "||"
                          }
                        }
                      } ]
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/description-types/{descriptionTypeId}" : {
      "get" : {
        "tags" : [ "Description types" ],
        "summary" : "Get a description type",
        "description" : "Retrieve a specific description type for a repository",
        "operationId" : "getDescriptionType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "descriptionTypeId",
          "in" : "path",
          "description" : "The UUID of the field (called a description type in the API).",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fada8022-a780-42c9-8209-ddba8b89c25a"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `connectedTo`, `connectedTo.hidden`, `connectedTo.position`, `connectedTo.type`, `dataType`, `icon`, `inputType`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.refinement`, `titles.summary`, `titles.title`, `titles.translated`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "connectedTo", "connectedTo.hidden", "connectedTo.position", "connectedTo.type", "dataType", "icon", "inputType", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.refinement", "titles.summary", "titles.title", "titles.translated", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DescriptionTypeView"
                },
                "example" : {
                  "uuid" : "b636bd50-40b2-4d47-89d6-a7b4b1e849bf",
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "Description"
                    }
                  },
                  "dataType" : "se.conciliate.rich.text",
                  "inputType" : "rich-text-editor",
                  "icon" : "/api/v1/icons/document_notebook.png?size=16",
                  "connectedTo" : [ ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Description types" ],
        "summary" : "Delete a description type",
        "description" : "Delete a specific description type for a repository",
        "operationId" : "deleteDescriptionType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "descriptionTypeId",
          "in" : "path",
          "description" : "The UUID of the field (called a description type in the API).",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fada8022-a780-42c9-8209-ddba8b89c25a"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Description types" ],
        "summary" : "Update a description type",
        "description" : "Update a specific description type for a repository",
        "operationId" : "updateDescriptionType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "descriptionTypeId",
          "in" : "path",
          "description" : "The UUID of the field (called a description type in the API).",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fada8022-a780-42c9-8209-ddba8b89c25a"
        } ],
        "requestBody" : {
          "description" : "MtbDescriptionTypeDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDescriptionTypeDto"
              },
              "examples" : {
                "Update titles" : {
                  "description" : "Update titles",
                  "value" : {
                    "titles" : {
                      "b636bd50-40b2-4d47-89d6-a7b4b1e849bf" : {
                        "title" : "example updated title"
                      }
                    }
                  }
                },
                "Update object type connection" : {
                  "description" : "Update object type connection",
                  "value" : {
                    "connectedTo" : [ {
                      "type" : "MODEL",
                      "position" : 2,
                      "hidden" : ""
                    } ]
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/directories" : {
      "get" : {
        "tags" : [ "Directories" ],
        "summary" : "List directories",
        "description" : "Retrieve all directories.",
        "operationId" : "getDirectories",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `name`, `parentDirectory`, `parentDirectory.parent`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "parentDirectory", "parentDirectory.parent", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `name`, `parentDirectory.parent`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "parentDirectory.parent", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `name`, `parentDirectory`, `parentDirectory.parent`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `name`, `parentDirectory`, `parentDirectory.parent`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "parentDirectory", "parentDirectory.parent", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DirectoryPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 3,
                  "data" : [ {
                    "uuid" : "92742b5b-7603-4661-bf08-1b73396203ce",
                    "name" : "test",
                    "parent" : null
                  }, {
                    "uuid" : "ca3aa5b1-d094-4cf6-84ab-e446091be3ff",
                    "name" : "Directory 01",
                    "parent" : null
                  }, {
                    "uuid" : "254b5a08-a660-49b1-898e-b2f0a1309f3c",
                    "name" : "Child directory 01",
                    "parent" : "ca3aa5b1-d094-4cf6-84ab-e446091be3ff"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Directories" ],
        "summary" : "Create a directory",
        "description" : "Create a directory",
        "operationId" : "createDirectory",
        "requestBody" : {
          "description" : "MtbDirectoryDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDirectoryDto"
              },
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "title" : "Directory name 01"
                  }
                },
                "With parent" : {
                  "description" : "With parent",
                  "value" : {
                    "title" : "Directory name 01",
                    "parent" : "ca3aa5b1-d094-4cf6-84ab-e446091be3ff"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDirectoryDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/directories/{directoryId}" : {
      "get" : {
        "tags" : [ "Directories" ],
        "summary" : "Get a directory",
        "description" : "Retrieve a specific directory.",
        "operationId" : "getDirectory",
        "parameters" : [ {
          "name" : "directoryId",
          "in" : "path",
          "description" : "The UUID of the directory.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "3157fa0e-ee9f-4050-8e1c-813b82cf68f3"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `name`, `parentDirectory`, `parentDirectory.parent`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "parentDirectory", "parentDirectory.parent", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DirectoryView"
                },
                "example" : {
                  "uuid" : "92742b5b-7603-4661-bf08-1b73396203ce",
                  "name" : "test",
                  "parent" : "ca3aa5b1-d094-4cf6-84ab-e446091be3ff"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Directories" ],
        "summary" : "Delete a directory",
        "description" : "Remove a directory",
        "operationId" : "deleteDirectory",
        "parameters" : [ {
          "name" : "directoryId",
          "in" : "path",
          "description" : "The UUID of the directory.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "3157fa0e-ee9f-4050-8e1c-813b82cf68f3"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Directories" ],
        "summary" : "Update a directory",
        "description" : "Update a directory",
        "operationId" : "updateDirectory",
        "parameters" : [ {
          "name" : "directoryId",
          "in" : "path",
          "description" : "The UUID of the directory.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "3157fa0e-ee9f-4050-8e1c-813b82cf68f3"
        } ],
        "requestBody" : {
          "description" : "MtbDirectoryDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDirectoryDto"
              },
              "examples" : {
                "Update title" : {
                  "description" : "Update title",
                  "value" : {
                    "title" : "New title",
                    "parent" : "254b5a08-a660-49b1-898e-b2f0a1309f3c"
                  }
                },
                "Update parent" : {
                  "description" : "Update parent",
                  "value" : {
                    "parent" : "ca3aa5b1-d094-4cf6-84ab-e446091be3ff"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/document-roots" : {
      "get" : {
        "tags" : [ "Document roots" ],
        "summary" : "List document roots",
        "description" : "Retrieve all document roots.",
        "operationId" : "getDocumentRoots",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `historyEdited`, `historyPath`, `key`, `lastModified`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `type`, `uuid`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyEdited", "historyPath", "key", "lastModified", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.title", "titles.uuid", "type", "uuid", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `historyEdited`, `historyPath`, `key`, `lastModified`, `type`, `uuid`, `value`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyEdited", "historyPath", "key", "lastModified", "type", "uuid", "value", "titles.title" ],
          "x-2c8-localized-sort-values" : [ "titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `historyPath`, `key`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `type`, `uuid`, `value`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `historyPath`, `key`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `type`, `uuid`, `value`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyPath", "key", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.title", "titles.uuid", "type", "uuid", "value" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DocumentRootPage"
                },
                "examples" : {
                  "document roots" : {
                    "description" : "document roots",
                    "value" : {
                      "startAt" : 0,
                      "maxResults" : 10,
                      "total" : 1,
                      "data" : [ {
                        "uuid" : "d9b7308e-702c-44e0-af89-d536285bef7d",
                        "titles" : {
                          "03b21698-31ff-4b09-b5f0-f0220d5d1ed5" : {
                            "title" : "Title 01"
                          }
                        },
                        "type" : "mtDocumentRoot",
                        "key" : "key1",
                        "value" : "value1",
                        "lastModified" : "2026-02-20T05:59:55Z",
                        "historyEdited" : true,
                        "historyPath" : null
                      } ]
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Document roots" ],
        "summary" : "Create a document root",
        "description" : "Create a document root",
        "operationId" : "CreateDocumentRoot",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "MtbDocumentRootDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDocumentRootDto"
              },
              "examples" : {
                "document root" : {
                  "description" : "document root",
                  "value" : {
                    "titles" : {
                      "lang1-uuid" : {
                        "title" : "example title"
                      }
                    },
                    "key" : "key1",
                    "value" : "value1"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDocumentRootDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/document-roots/{documentRootId}" : {
      "get" : {
        "tags" : [ "Document roots" ],
        "summary" : "Get a document root",
        "description" : "Retrieve a document root for a repository",
        "operationId" : "getDocumentRoot",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "documentRootId",
          "in" : "path",
          "description" : "The UUID of the document root.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d9c3efdd-a3ff-4b6f-b74a-2cf4a6a038d1"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `historyEdited`, `historyPath`, `key`, `lastModified`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `type`, `uuid`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyEdited", "historyPath", "key", "lastModified", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.title", "titles.uuid", "type", "uuid", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DocumentRootView"
                },
                "examples" : {
                  "document root" : {
                    "description" : "document root",
                    "value" : {
                      "uuid" : "d9b7308e-702c-44e0-af89-d536285bef7d",
                      "titles" : {
                        "03b21698-31ff-4b09-b5f0-f0220d5d1ed5" : {
                          "title" : "Title 01"
                        }
                      },
                      "type" : "mtDocumentRoot",
                      "key" : "key1",
                      "value" : "value1",
                      "lastModified" : "2026-02-20T05:59:55Z",
                      "historyEdited" : true,
                      "historyPath" : null
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Document roots" ],
        "summary" : "Delete a document root",
        "description" : "Delete the document root with the provided uuid.",
        "operationId" : "deleteDocumentRoot",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "documentRootId",
          "in" : "path",
          "description" : "The UUID of the document root.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d9c3efdd-a3ff-4b6f-b74a-2cf4a6a038d1"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Document roots" ],
        "summary" : "Partially update a document root",
        "description" : "Update part of a document root.",
        "operationId" : "updateDocumentRoot",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "documentRootId",
          "in" : "path",
          "description" : "The UUID of the document root.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d9c3efdd-a3ff-4b6f-b74a-2cf4a6a038d1"
        } ],
        "requestBody" : {
          "description" : "MtbDocumentRoot object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDocumentRootDto"
              },
              "examples" : {
                "document root" : {
                  "description" : "document root",
                  "value" : {
                    "value" : "New value"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A success message.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/document-types" : {
      "get" : {
        "tags" : [ "Document types" ],
        "summary" : "List document types",
        "description" : "Retrieve all document types for a repository.",
        "operationId" : "getDocumentTypes",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `historyEdited`, `historyPath`, `lastModified`, `titles`, `titles.languageEntity`, `titles.languageEntity.defaultLanguage`, `titles.languageEntity.uuid`, `titles.title`, `titles.translated`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyEdited", "historyPath", "lastModified", "titles", "titles.languageEntity", "titles.languageEntity.defaultLanguage", "titles.languageEntity.uuid", "titles.title", "titles.translated", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `historyEdited`, `historyPath`, `lastModified`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyEdited", "historyPath", "lastModified", "uuid", "titles.title" ],
          "x-2c8-localized-sort-values" : [ "titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `historyPath`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `historyPath`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyPath", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.title", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DocumentTypePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 4,
                  "data" : [ {
                    "uuid" : "1e5e3b98-ffa4-4e19-9206-f37ee762bb4e",
                    "lastModified" : "2017-05-24T13:50:00Z",
                    "historyEdited" : false,
                    "historyPath" : [ "570cd4fe-23b6-4b02-a896-b32a9090ebb4", "c8ba7397-cf1d-4889-abee-a03546d01f33" ],
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Checklist"
                      }
                    }
                  }, {
                    "uuid" : "c76651a3-e680-407b-83dc-1fa22b2c90ff",
                    "lastModified" : "2017-05-24T13:50:05Z",
                    "historyEdited" : false,
                    "historyPath" : [ "aaa1985d-ec6c-4e52-a720-7ca49e680d53", "348ceccd-216b-42b8-8cea-7a724a971156" ],
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Template"
                      }
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Document types" ],
        "summary" : "Create document type",
        "description" : "Created. Request has been successfully created",
        "operationId" : "createDocumentType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "The document type to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDocumentTypeDto"
              },
              "examples" : {
                "Minimal" : {
                  "summary" : "Required fields only",
                  "description" : "Smallest valid payload containing one title entry.",
                  "value" : {
                    "titles" : {
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                        "title" : "Document type language 1"
                      }
                    }
                  }
                },
                "With optional properties" : {
                  "summary" : "Payload with optional flags",
                  "description" : "Includes optional translated property in the title.",
                  "value" : {
                    "titles" : {
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                        "title" : "Document type language 1",
                        "translated" : true
                      }
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDocumentTypeDto"
                },
                "example" : {
                  "uuid" : "a1175f5a-0e17-4cea-9ba3-eed312d0971a",
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "uuid" : "309bb88b-a4a4-4761-aa31-8ac85bf3a915",
                      "title" : "Document type language 1",
                      "documentTypeUuid" : "a1175f5a-0e17-4cea-9ba3-eed312d0971a",
                      "languageUuid" : "b030a9f8-a89c-41c4-a972-0da5763c4d95",
                      "translated" : true
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/document-types/{documentTypeId}" : {
      "get" : {
        "tags" : [ "Document types" ],
        "summary" : "Get a document type",
        "description" : "Retrieve a specific document type for a repository.",
        "operationId" : "getDocumentType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "documentTypeId",
          "in" : "path",
          "description" : "The UUID of the document type.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "ab553e84-5d6b-416d-a810-10007170b837"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `historyEdited`, `historyPath`, `lastModified`, `titles`, `titles.languageEntity`, `titles.languageEntity.defaultLanguage`, `titles.languageEntity.uuid`, `titles.title`, `titles.translated`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "historyEdited", "historyPath", "lastModified", "titles", "titles.languageEntity", "titles.languageEntity.defaultLanguage", "titles.languageEntity.uuid", "titles.title", "titles.translated", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DocumentTypeView"
                },
                "example" : {
                  "uuid" : "1e5e3b98-ffa4-4e19-9206-f37ee762bb4e",
                  "lastModified" : "2017-05-24T13:50:00Z",
                  "historyEdited" : false,
                  "historyPath" : [ "570cd4fe-23b6-4b02-a896-b32a9090ebb4", "c8ba7397-cf1d-4889-abee-a03546d01f33" ],
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "Checklist"
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Document types" ],
        "summary" : "Delete document type",
        "description" : "Delete a specific document type for a repository.",
        "operationId" : "deleteDocumentType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "documentTypeId",
          "in" : "path",
          "description" : "The UUID of the document type.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "ab553e84-5d6b-416d-a810-10007170b837"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Document types" ],
        "summary" : "Update document type",
        "description" : "Update properties of a specific document type for a repository.",
        "operationId" : "updateDocumentType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "documentTypeId",
          "in" : "path",
          "description" : "The UUID of the document type.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "ab553e84-5d6b-416d-a810-10007170b837"
        } ],
        "requestBody" : {
          "description" : "The document type to update",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDocumentTypeDto"
              },
              "examples" : {
                "Default" : {
                  "summary" : "Typical update payload",
                  "description" : "Updates a title and translated status for one language.",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Checklist",
                        "translated" : false
                      }
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/documents/sources" : {
      "get" : {
        "tags" : [ "Documents" ],
        "summary" : "List document sources available in a repository",
        "operationId" : "getDocumentSources",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "language",
          "in" : "query",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "An array of strings is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DocumentSources"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/documents/sources/{sourceId}/documents" : {
      "get" : {
        "tags" : [ "Documents" ],
        "summary" : "List document keys from a document source",
        "operationId" : "listDocumentKeys",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "sourceId",
          "in" : "path",
          "description" : "The document source identifier.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "string"
          },
          "example" : "mt.documents"
        }, {
          "name" : "language",
          "in" : "query",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "An array of strings is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/DocumentKeys"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/documents/sources/{sourceId}/documents/resolve" : {
      "post" : {
        "tags" : [ "Documents" ],
        "summary" : "Resolve document keys to document metadata",
        "operationId" : "resolveDocuments",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "sourceId",
          "in" : "path",
          "description" : "The document source identifier.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "string"
          },
          "example" : "mt.documents"
        } ],
        "requestBody" : {
          "content" : {
            "*/*" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbResolveDocumentDto"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ResolvedDocuments"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/canvas/edges" : {
      "post" : {
        "tags" : [ "Edges" ],
        "summary" : "Create an edge",
        "description" : "Create a new edge for a model in a repository",
        "operationId" : "createEdge",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "requestBody" : {
          "description" : "The edge to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbEdgeDto"
              },
              "examples" : {
                "Minimal" : {
                  "summary" : "Required fields only",
                  "description" : "Create edge with mandatory fields and labels.",
                  "value" : {
                    "points" : [ {
                      "x" : 609,
                      "y" : 156
                    }, {
                      "x" : 863,
                      "y" : 156
                    }, {
                      "x" : 863,
                      "y" : 205
                    }, {
                      "x" : 848,
                      "y" : 205
                    } ],
                    "edgeType" : "FLOW",
                    "toVertex" : "17dd0995-d0d9-4c24-b69b-3c5dac961f51",
                    "fromVertex" : "5d142c0a-a9b2-4ba3-b1d7-208c85ac2895",
                    "labels" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "eds_test",
                        "rawTitle" : "eds_raw_title",
                        "x" : 716,
                        "y" : 156,
                        "height" : 22,
                        "width" : 57
                      }
                    }
                  }
                },
                "With optional fields" : {
                  "summary" : "Includes optional router",
                  "description" : "Create edge with optional routing field.",
                  "value" : {
                    "points" : [ {
                      "x" : 609,
                      "y" : 156
                    }, {
                      "x" : 863,
                      "y" : 156
                    }, {
                      "x" : 863,
                      "y" : 205
                    }, {
                      "x" : 848,
                      "y" : 205
                    } ],
                    "edgeType" : "FLOW",
                    "router" : "se.conciliate.mt.router.def.router",
                    "toVertex" : "17dd0995-d0d9-4c24-b69b-3c5dac961f51",
                    "fromVertex" : "5d142c0a-a9b2-4ba3-b1d7-208c85ac2895",
                    "labels" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "eds_test",
                        "rawTitle" : "eds_raw_title",
                        "x" : 716,
                        "y" : 156,
                        "height" : 22,
                        "width" : 57
                      }
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbEdgeDto"
                },
                "examples" : {
                  "Created edge response" : {
                    "description" : "Created edge response",
                    "value" : {
                      "uuid" : "6c6503a4-cd2d-4ac1-b8d4-562f40ea80c0",
                      "edgeType" : "FLOW",
                      "fromVertex" : "843312df-b54a-423f-b635-14fca3369f5c",
                      "toVertex" : "79fece73-28fc-4b12-a76d-8eb31f768380",
                      "breakdowns" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151" ],
                      "router" : "se.conciliate.mt.router.def.router",
                      "points" : [ {
                        "x" : 160,
                        "y" : 145
                      }, {
                        "x" : 260,
                        "y" : 145
                      }, {
                        "x" : 260,
                        "y" : 215
                      } ],
                      "labels" : {
                        "d14372e0-abf4-4f5f-aca8-89cbe80d6f6b" : {
                          "title" : "Flow",
                          "rawTitle" : "Flow",
                          "x" : 205,
                          "y" : 150,
                          "width" : 64,
                          "height" : 22
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/canvas/edges/{edgeId}" : {
      "delete" : {
        "tags" : [ "Edges" ],
        "summary" : "Delete an edge",
        "description" : "Delete a specific edge from a model in a repository",
        "operationId" : "deleteEdge",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "edgeId",
          "in" : "path",
          "description" : "The UUID of the edge.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fada8022-a780-42c9-8209-ddba8b89c25a"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/groups/{groupId}" : {
      "get" : {
        "tags" : [ "Groups" ],
        "summary" : "Get a group",
        "description" : "Retrieve a specific group.",
        "operationId" : "getGroup",
        "parameters" : [ {
          "name" : "groupId",
          "in" : "path",
          "description" : "The UUID of the group.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "bc251c04-9a18-412f-bd8d-1525d164a1b3"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `name`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/GroupView"
                },
                "example" : {
                  "uuid" : "3ae4026c-a61e-4f22-9493-71d64e8c5a00",
                  "name" : "GRP_MTB_301"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/groups" : {
      "get" : {
        "tags" : [ "Groups" ],
        "summary" : "List groups",
        "description" : "Retrieve all groups.",
        "operationId" : "getGroups",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `name`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `name`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `name`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `name`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "name", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/GroupPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "3ae4026c-a61e-4f22-9493-71d64e8c5a00",
                    "name" : "GRP_MTB_301"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/icons/{iconName}" : {
      "get" : {
        "tags" : [ "Icons" ],
        "summary" : "Get a generic icon",
        "description" : "Returns an icon image using the following scheme:\n- `/api/v1/icons/{name}` for generic icons\n- `/api/v1/icons/{name}?size=24` to request a different output size\n- `/api/v1/icons/{name}?collection=o&style=<opaque-token>` for legacy O-collection styling\n\nExamples:\n- `/api/v1/icons/earth2.png`\n- `/api/v1/icons/nav_down.png?size=24&collection=o&style=s_...`\n\n`collection=o` and `collection=i` request the O/I icon collections.\n`style` is an opaque server-generated token used to preserve legacy icon rendering metadata.\n`size` defaults to `48` when omitted.\n\n`showUnknownIcon=false` (default) returns `404 Not Found` for missing icons.\n`showUnknownIcon=true` returns a missing-icon placeholder instead.\n",
        "operationId" : "getGenericIcon",
        "parameters" : [ {
          "name" : "iconName",
          "in" : "path",
          "description" : "The icon file name.",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "earth2.png"
        }, {
          "name" : "size",
          "in" : "query",
          "description" : "The requested output size in pixels. Defaults to 48 when omitted.",
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "format" : "int64",
            "default" : 48
          }
        }, {
          "name" : "showUnknownIcon",
          "in" : "query",
          "description" : "When true, missing icons return a missing-icon placeholder instead of `404 Not Found`.",
          "schema" : {
            "type" : "boolean",
            "default" : false
          }
        }, {
          "name" : "collection",
          "in" : "query",
          "description" : "Optional themed collection selector for generic icons. Allowed values: `o`, `i`.",
          "schema" : {
            "type" : "string",
            "enum" : [ "o", "i" ]
          }
        }, {
          "name" : "style",
          "in" : "query",
          "description" : "Opaque server-generated token that preserves legacy rendering metadata for collection icons.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "PNG image returned",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "image/png" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/icons/edge/{iconName}" : {
      "get" : {
        "tags" : [ "Icons" ],
        "summary" : "Get a rendered edge icon",
        "description" : "Returns a rendered edge icon.\n\nExamples:\n- `/api/v1/icons/edge/FLOW`\n- `/api/v1/icons/edge/CONSISTS_OF`\n- `/api/v1/icons/edge/FLOW?size=24`\n\nThe built-in names are documented on the `iconName` parameter schema.\nUnrecognized names follow the missing-icon behavior below.\n`size` defaults to `48` when omitted.\n\n`showUnknownIcon=false` (default) returns `404 Not Found` for missing icons.\n`showUnknownIcon=true` returns a missing-icon placeholder instead.\n",
        "operationId" : "getRenderedEdgeIcon",
        "parameters" : [ {
          "name" : "size",
          "in" : "query",
          "description" : "The requested output size in pixels. Defaults to 48 when omitted.",
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "format" : "int64",
            "default" : 48
          }
        }, {
          "name" : "iconName",
          "in" : "path",
          "description" : "The rendered edge name.",
          "required" : true,
          "schema" : {
            "$ref" : "#/components/schemas/RenderedEdgeName"
          },
          "example" : "FLOW"
        }, {
          "name" : "showUnknownIcon",
          "in" : "query",
          "description" : "When true, missing icons return a missing-icon placeholder instead of `404 Not Found`.",
          "schema" : {
            "type" : "boolean",
            "default" : false
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "PNG image returned",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "image/png" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/icons/model/{iconName}" : {
      "get" : {
        "tags" : [ "Icons" ],
        "summary" : "Get a rendered model icon",
        "description" : "Returns a rendered model icon.\n\nExamples:\n- `/api/v1/icons/model/PROCESS_MODEL`\n- `/api/v1/icons/model/APPLICATION_MODEL`\n- `/api/v1/icons/model/PROCESS_MODEL?size=24`\n\nThe built-in names are documented on the `iconName` parameter schema.\nUnrecognized names follow the missing-icon behavior below.\n`size` defaults to `48` when omitted.\n\n`showUnknownIcon=false` (default) returns `404 Not Found` for missing icons.\n`showUnknownIcon=true` returns a missing-icon placeholder instead.\n",
        "operationId" : "getRenderedModelIcon",
        "parameters" : [ {
          "name" : "size",
          "in" : "query",
          "description" : "The requested output size in pixels. Defaults to 48 when omitted.",
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "format" : "int64",
            "default" : 48
          }
        }, {
          "name" : "iconName",
          "in" : "path",
          "description" : "The rendered model name.",
          "required" : true,
          "schema" : {
            "$ref" : "#/components/schemas/RenderedModelName"
          },
          "example" : "PROCESS_MODEL"
        }, {
          "name" : "showUnknownIcon",
          "in" : "query",
          "description" : "When true, missing icons return a missing-icon placeholder instead of `404 Not Found`.",
          "schema" : {
            "type" : "boolean",
            "default" : false
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "PNG image returned",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "image/png" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/icons/symbol/{iconName}" : {
      "get" : {
        "tags" : [ "Icons" ],
        "summary" : "Get a rendered symbol icon",
        "description" : "Returns a rendered symbol icon.\n\nExamples:\n- `/api/v1/icons/symbol/PROCESS`\n- `/api/v1/icons/symbol/ROLE`\n- `/api/v1/icons/symbol/OR`\n- `/api/v1/icons/symbol/PROCESS?size=24`\n\nThe built-in names are documented on the `iconName` parameter schema.\nUnrecognized names follow the missing-icon behavior below.\n`size` defaults to `48` when omitted.\n`showUnknownIcon=false` (default) returns `404 Not Found` for missing icons.\n`showUnknownIcon=true` returns a missing-icon placeholder instead.\n",
        "operationId" : "getRenderedSymbolIcon",
        "parameters" : [ {
          "name" : "size",
          "in" : "query",
          "description" : "The requested output size in pixels. Defaults to 48 when omitted.",
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "format" : "int64",
            "default" : 48
          }
        }, {
          "name" : "iconName",
          "in" : "path",
          "description" : "The rendered symbol name.",
          "required" : true,
          "schema" : {
            "$ref" : "#/components/schemas/RenderedSymbolName"
          },
          "example" : "PROCESS"
        }, {
          "name" : "showUnknownIcon",
          "in" : "query",
          "description" : "When true, missing icons return a missing-icon placeholder instead of `404 Not Found`.",
          "schema" : {
            "type" : "boolean",
            "default" : false
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "PNG image returned",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "image/png" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/installed-plugins" : {
      "get" : {
        "tags" : [ "Installed plugins" ],
        "summary" : "List installed plugins",
        "description" : "Retrieve all installed plugins",
        "operationId" : "getInstalledPlugins",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `autoUpgrade`, `id`, `logo`, `maxApiVersionExclusive`, `minApiVersion`, `repositories`, `repositories.uuid`, `targetVersion`, `users`, `users.userId`, `version`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "autoUpgrade", "id", "logo", "maxApiVersionExclusive", "minApiVersion", "repositories", "repositories.uuid", "targetVersion", "users", "users.userId", "version" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `autoUpgrade`, `id`, `logo`, `maxApiVersionExclusive`, `minApiVersion`, `targetVersion`, `version`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "autoUpgrade", "id", "logo", "maxApiVersionExclusive", "minApiVersion", "targetVersion", "version" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `id`, `logo`, `maxApiVersionExclusive`, `minApiVersion`, `repositories`, `repositories.uuid`, `targetVersion`, `users`, `users.userId`, `version`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `id`, `logo`, `maxApiVersionExclusive`, `minApiVersion`, `repositories`, `repositories.uuid`, `targetVersion`, `users`, `users.userId`, `version`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "id", "logo", "maxApiVersionExclusive", "minApiVersion", "repositories", "repositories.uuid", "targetVersion", "users", "users.userId", "version" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/InstalledPluginPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "id" : "785ebf24-861e-41d9-937f-c7e61b05c0c3",
                    "version" : "1.2",
                    "minApiVersion" : "1",
                    "maxApiVersionExclusive" : "2",
                    "autoUpgrade" : false,
                    "logo" : null,
                    "targetVersion" : null,
                    "repositories" : null,
                    "users" : null
                  }, {
                    "id" : "1",
                    "version" : "1.0.0.2",
                    "minApiVersion" : "2.1",
                    "maxApiVersionExclusive" : "4.3",
                    "autoUpgrade" : false,
                    "logo" : null,
                    "targetVersion" : null,
                    "repositories" : [ "603055e8-4734-461e-bf42-d4456afe7bb7" ],
                    "users" : null
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Installed plugins" ],
        "summary" : "Create an installed plugin",
        "description" : "Create an installed plugin",
        "operationId" : "createInstalledPlugin",
        "requestBody" : {
          "description" : "The request body to create an installed plugin",
          "content" : {
            "application/json" : {
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "id" : "1",
                    "version" : {
                      "first" : 1,
                      "second" : 0,
                      "third" : 0,
                      "fourth" : 2
                    },
                    "minApiVersion" : {
                      "major" : 2,
                      "minor" : 1
                    },
                    "maxApiVersionExclusive" : {
                      "major" : 4,
                      "minor" : 3
                    },
                    "data" : "SGVsbG8=",
                    "autoUpgrade" : false,
                    "logo" : "sample_logo.png",
                    "targetVersion" : "1.0",
                    "repositories" : [ "603055e8-4734-461e-bf42-d4456afe7bb7" ]
                  }
                },
                "With additional properties" : {
                  "description" : "With additional properties",
                  "value" : {
                    "id" : "b093d9ef-5d12-4ddd-a83a-85fa2c42317c",
                    "version" : {
                      "first" : 1,
                      "second" : 0,
                      "third" : 0,
                      "fourth" : 2
                    },
                    "minApiVersion" : {
                      "major" : 2,
                      "minor" : 1
                    },
                    "maxApiVersionExclusive" : {
                      "major" : 4,
                      "minor" : 3
                    },
                    "autoUpgrade" : false,
                    "logo" : "sample_logo.png",
                    "targetVersion" : "1.0",
                    "data" : "SGVsbG8=",
                    "repositories" : [ "603055e8-4734-461e-bf42-d4456afe7bb7" ],
                    "clientCompatible" : false,
                    "serverCompatible" : true
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbInstalledPluginDto"
                },
                "example" : {
                  "id" : "1",
                  "version" : {
                    "first" : 1,
                    "second" : 0,
                    "third" : 0,
                    "fourth" : 2
                  },
                  "minApiVersion" : {
                    "major" : 2,
                    "minor" : 1
                  },
                  "maxApiVersionExclusive" : {
                    "major" : 4,
                    "minor" : 3
                  },
                  "data" : "SGVsbG8=",
                  "autoUpgrade" : false,
                  "logo" : null,
                  "targetVersion" : null,
                  "installedUsers" : [ ],
                  "repositories" : [ "603055e8-4734-461e-bf42-d4456afe7bb7" ],
                  "clientCompatible" : true,
                  "serverCompatible" : false
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/installed-plugins/{pluginId}" : {
      "get" : {
        "tags" : [ "Installed plugins" ],
        "summary" : "Get an installed plugin",
        "description" : "Retrieve a specified installed plugins",
        "operationId" : "getInstalledPlugin",
        "parameters" : [ {
          "name" : "pluginId",
          "in" : "path",
          "description" : "The installed plugin identifier, for example `stratsys`.",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "stratsys"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `autoUpgrade`, `id`, `logo`, `maxApiVersionExclusive`, `minApiVersion`, `repositories`, `repositories.uuid`, `targetVersion`, `users`, `users.userId`, `version`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "autoUpgrade", "id", "logo", "maxApiVersionExclusive", "minApiVersion", "repositories", "repositories.uuid", "targetVersion", "users", "users.userId", "version" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/InstalledPluginView"
                },
                "example" : {
                  "id" : "1",
                  "version" : "1.0.0.2",
                  "minApiVersion" : "2.1",
                  "maxApiVersionExclusive" : "4.3",
                  "autoUpgrade" : false,
                  "logo" : null,
                  "targetVersion" : null,
                  "repositories" : [ "603055e8-4734-461e-bf42-d4456afe7bb7" ],
                  "users" : null
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Installed plugins" ],
        "summary" : "Delete an installed plugin",
        "description" : "Delete an installed plugin",
        "operationId" : "deleteInstalledPlugin",
        "parameters" : [ {
          "name" : "pluginId",
          "in" : "path",
          "description" : "The installed plugin identifier, for example `stratsys`.",
          "required" : true,
          "schema" : {
            "pattern" : "[a-zA-Z0-9\\-]+",
            "type" : "string"
          },
          "example" : "stratsys"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Installed plugins" ],
        "summary" : "Update an installed plugin",
        "description" : "Update an installed plugin",
        "operationId" : "updateInstalledPlugin",
        "parameters" : [ {
          "name" : "pluginId",
          "in" : "path",
          "description" : "The installed plugin identifier, for example `stratsys`.",
          "required" : true,
          "schema" : {
            "pattern" : "[a-zA-Z0-9\\-]+",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "description" : "The request body to update an installed plugin.",
          "content" : {
            "application/json" : {
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "version" : {
                      "first" : 2,
                      "second" : 0,
                      "third" : 2,
                      "fourth" : 2
                    },
                    "autoUpgrade" : false,
                    "repositories" : [ "603055e8-4734-461e-bf42-d4456afe7bb7" ]
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/languages" : {
      "get" : {
        "tags" : [ "Languages" ],
        "summary" : "List languages",
        "description" : "Retrieve all languages for a repository",
        "operationId" : "getLanguages",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `defaultLanguage`, `hyphenationDictionary`, `icon`, `iso`, `name`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "defaultLanguage", "hyphenationDictionary", "icon", "iso", "name", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `defaultLanguage`, `hyphenationDictionary`, `icon`, `iso`, `name`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "defaultLanguage", "hyphenationDictionary", "icon", "iso", "name", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `hyphenationDictionary`, `icon`, `iso`, `name`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `hyphenationDictionary`, `icon`, `iso`, `name`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "hyphenationDictionary", "icon", "iso", "name", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/LanguagePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "b030a9f8-a89c-41c4-a972-0da5763c4d95",
                    "defaultLanguage" : true,
                    "name" : "English",
                    "iso" : null,
                    "hyphenationDictionary" : null,
                    "icon" : "/api/v1/icons/flag_great_britain.png?size=16"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Languages" ],
        "summary" : "Create a new language",
        "description" : "Creates a new language associated with a specific repository.",
        "operationId" : "createLanguage",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "Language data to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbLanguageDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "name" : "English"
                  }
                },
                "With additional properties" : {
                  "description" : "With additional properties",
                  "value" : {
                    "name" : "English",
                    "icon" : "/api/v1/icons/flag_great_britain.png?size=16",
                    "iso" : "en",
                    "defaultLanguage" : true,
                    "hyphenationDictionary" : "",
                    "copyFromLanguageUuid" : "b030a9f8-a89c-41c4-a972-0da5763c4d95"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbLanguageDto"
                },
                "example" : {
                  "uuid" : "e72c836f-5658-4c9f-a20a-e97ef0c2ef97",
                  "name" : "English",
                  "icon" : "/api/v1/icons/flag_great_britain.png?size=16",
                  "defaultLanguage" : true,
                  "hyphenationDictionary" : ""
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/languages/{languageId}" : {
      "get" : {
        "tags" : [ "Languages" ],
        "summary" : "Get a language",
        "description" : "Retrieve a specific language for a repository",
        "operationId" : "getLanguage",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "languageId",
          "in" : "path",
          "description" : "The UUID of the language.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "1ca77c05-a2c4-451a-8705-9e70a0a8acf8"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `defaultLanguage`, `hyphenationDictionary`, `icon`, `iso`, `name`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "defaultLanguage", "hyphenationDictionary", "icon", "iso", "name", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/LanguageView"
                },
                "example" : {
                  "uuid" : "b030a9f8-a89c-41c4-a972-0da5763c4d95",
                  "defaultLanguage" : true,
                  "name" : "English",
                  "iso" : null,
                  "hyphenationDictionary" : null,
                  "icon" : "/api/v1/icons/flag_great_britain.png?size=16"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Languages" ],
        "summary" : "Delete a language",
        "description" : "Deletes a specific language from a repository.",
        "operationId" : "deleteLanguage",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "languageId",
          "in" : "path",
          "description" : "The UUID of the language.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e5cbac72-b6b4-4193-a421-a61033e474b3"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Languages" ],
        "summary" : "Update an existing language partially",
        "description" : "Applies a partial update to an existing language. Only fields provided in the request body will be updated.",
        "operationId" : "updateLanguage",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "languageId",
          "in" : "path",
          "description" : "The UUID of the language.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e5cbac72-b6b4-4193-a421-a61033e474b3"
        } ],
        "requestBody" : {
          "description" : "Language data to update. Only non-null fields will be applied.",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbLanguageDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "defaultLanguage" : true,
                    "name" : "English",
                    "iso" : "iso",
                    "hyphenationDictionary" : "hyphen",
                    "icon" : "/api/v1/icons/flag_great_britain.png?size=16"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A success message.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/layer-types" : {
      "get" : {
        "tags" : [ "Layer types" ],
        "summary" : "List layer types",
        "description" : "Retrieve all layer types for a repository",
        "operationId" : "getLayerTypes",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `ikon`, `modelType`, `objectTypes`, `repositoryEntity`, `titles`, `titles.language`, `titles.language.defaultLanguage`, `titles.language.uuid`, `titles.title`, `titles.translated`, `uuid`, `zOrder`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "ikon", "modelType", "objectTypes", "repositoryEntity", "titles", "titles.language", "titles.language.defaultLanguage", "titles.language.uuid", "titles.title", "titles.translated", "uuid", "zOrder" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `ikon`, `modelType`, `objectTypes`, `uuid`, `zOrder`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "ikon", "modelType", "objectTypes", "uuid", "zOrder", "titles.title" ],
          "x-2c8-localized-sort-values" : [ "titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `ikon`, `modelType`, `objectTypes`, `titles`, `titles.language`, `titles.language.uuid`, `titles.title`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `ikon`, `modelType`, `objectTypes`, `titles`, `titles.language`, `titles.language.uuid`, `titles.title`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "ikon", "modelType", "objectTypes", "titles", "titles.language", "titles.language.uuid", "titles.title", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/LayerTypePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 12,
                  "data" : [ {
                    "uuid" : "f1bee511-f3c9-4949-8538-7869eb284d23",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Notes"
                      }
                    },
                    "zOrder" : 0,
                    "modelType" : "REQUIREMENT_MODEL",
                    "objectTypes" : "POSSIBILITY;NOTE;PROBLEM;RISK;STRENGTH;WEAKNESS;",
                    "ikon" : "/api/v1/icons/document_notebook.png?size=16"
                  }, {
                    "uuid" : "1f0f34f1-1708-40a3-85ab-44252e7d00f6",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Responsible"
                      }
                    },
                    "zOrder" : 0,
                    "modelType" : "PROJECT_MODEL",
                    "objectTypes" : "ROLE;POSITION;INDIVIDUAL;",
                    "ikon" : "/api/v1/icons/symbol/ROLE?size=16"
                  }, {
                    "uuid" : "05ab9507-ffce-421e-9e2f-8c2c5cbbad7a",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Notes"
                      }
                    },
                    "zOrder" : 0,
                    "modelType" : "PRODUCT_MODEL",
                    "objectTypes" : "POSSIBILITY;NOTE;PROBLEM;RISK;STRENGTH;WEAKNESS;",
                    "ikon" : "/api/v1/icons/document_notebook.png?size=16"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Layer types" ],
        "summary" : "Create a layer type",
        "description" : "Create a specific layer type for a repository",
        "operationId" : "CreateLayerType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "The layer type to create",
          "content" : {
            "application/json" : {
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Individuals"
                      },
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                        "title" : "Group"
                      }
                    },
                    "zOrder" : 0,
                    "modelType" : "ORGANISATION_MODEL",
                    "objectTypes" : "INDIVIDUAL;",
                    "ikon" : "/api/v1/icons/users.png?size=16"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbLayerTypeDto"
                },
                "example" : {
                  "uuid" : "4a4f5c01-1efa-42a9-a4fb-559e4eb000f2",
                  "modelType" : "ORGANISATION_MODEL",
                  "objectTypes" : "INDIVIDUAL;",
                  "ikon" : "/api/v1/icons/users.png?size=16",
                  "titles" : {
                    "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                      "title" : "Group",
                      "translated" : true
                    },
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "Individuals",
                      "translated" : true
                    }
                  },
                  "zorder" : 0
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/layer-types/{layerTypeId}" : {
      "get" : {
        "tags" : [ "Layer types" ],
        "summary" : "Get a layer type",
        "description" : "Retrieve a specific layer type for a repository",
        "operationId" : "getLayerType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "layerTypeId",
          "in" : "path",
          "description" : "The UUID of the layer type.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "01f8569d-7952-48bf-aa29-034ba44dc9a3"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `ikon`, `modelType`, `objectTypes`, `repositoryEntity`, `titles`, `titles.language`, `titles.language.defaultLanguage`, `titles.language.uuid`, `titles.title`, `titles.translated`, `uuid`, `zOrder`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "ikon", "modelType", "objectTypes", "repositoryEntity", "titles", "titles.language", "titles.language.defaultLanguage", "titles.language.uuid", "titles.title", "titles.translated", "uuid", "zOrder" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/LayerTypeView"
                },
                "example" : {
                  "uuid" : "1ddf6c9c-3d6a-4874-a303-84e99a313880",
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "Individuals"
                    }
                  },
                  "zOrder" : 0,
                  "modelType" : "ORGANISATION_MODEL",
                  "objectTypes" : "INDIVIDUAL;",
                  "ikon" : "/api/v1/icons/users.png?size=16"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Layer types" ],
        "summary" : "Delete a layer type",
        "description" : "Remove a layer type",
        "operationId" : "deleteLayerType",
        "parameters" : [ {
          "name" : "layerTypeId",
          "in" : "path",
          "description" : "The UUID of the layer type.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "3157fa0e-ee9f-4050-8e1c-813b82cf68f3"
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Layer types" ],
        "summary" : "Update a layer type",
        "description" : "Update a specific layer type for a repository",
        "operationId" : "UpdateLayerType",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "layerTypeId",
          "in" : "path",
          "description" : "The UUID of the layer type.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "The layer type to update.",
          "content" : {
            "application/json" : {
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "New Individuals"
                      },
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                        "title" : "New Group"
                      }
                    },
                    "zOrder" : 0,
                    "modelType" : "ORGANISATION_MODEL",
                    "objectTypes" : "INDIVIDUAL;",
                    "ikon" : "/api/v1/icons/users.png?size=16"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/layers" : {
      "get" : {
        "tags" : [ "Layers" ],
        "summary" : "List layers",
        "description" : "Retrieve all layers for a repository",
        "operationId" : "getLayers",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "80c41767-0247-4f60-9d58-c5e925ff8585"
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/LayerPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "layerType" : "f1bee511-f3c9-4949-8538-7869eb284d23",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Notes"
                      }
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Layers" ],
        "summary" : "Create a layer",
        "description" : "Create a specific layer for a model",
        "operationId" : "createLayer",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "b7c36c10-39e3-4fe1-914d-8247f250fb95"
        } ],
        "requestBody" : {
          "description" : "Layers",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbLayerDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "layerType" : "f1bee511-f3c9-4949-8538-7869eb284d23"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbLayerDto"
                },
                "example" : {
                  "uuid" : "e46efd0c-4a81-4cde-933f-241ac88def53",
                  "layerType" : "f1bee511-f3c9-4949-8538-7869eb284d23"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "409" : {
            "description" : "There is a resource conflict. A resource may be locked or already exist."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/layers/{layerTypeId}" : {
      "delete" : {
        "tags" : [ "Layers" ],
        "summary" : "Delete a layer",
        "description" : "Delete a layer",
        "operationId" : "deleteLayer",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "layerTypeId",
          "in" : "path",
          "description" : "The UUID of the layer type.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "ada06d82-53ee-4eed-b9c3-dbbfa1bcc14a"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/lists/{listId}/execute" : {
      "post" : {
        "tags" : [ "Lists" ],
        "summary" : "Execute existing list",
        "description" : "Execute existing list",
        "operationId" : "executeExistingList",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "listId",
          "in" : "path",
          "description" : "The UUID of the list.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60c02ee8-4814-44db-8d40-08ed78d14401"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbExecuteListDto"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "200",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbListResultDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/lists/execute" : {
      "post" : {
        "tags" : [ "Lists" ],
        "summary" : "Execute list",
        "description" : "Execute list",
        "operationId" : "executeList",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbExecuteListDto"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbListResultDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/lists/{listId}" : {
      "get" : {
        "tags" : [ "Lists" ],
        "summary" : "Get a list",
        "description" : "Retrieve a specific list in a repository",
        "operationId" : "getList",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "listId",
          "in" : "path",
          "description" : "The UUID of the list.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c4d0162c-836f-4fb2-a80c-330f167118ee"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbListDto"
                },
                "example" : {
                  "uuid" : "074cc3ea-54c2-4fa2-8f56-ae834a83c93d",
                  "queryXml" : "<?xml version=\"1.0\" encoding=\"UTF-8\"?><query><sub-query query-type=\"se.conciliate.mt.store.MTModelQueryImpl\" result-type=\"se.conciliate.extensions.store.MTModel\"><contexts/><select-all>true</select-all><select-subset>false</select-subset><owning-subset>false</owning-subset><only-locked-revisions>false</only-locked-revisions><include-initial-revisions>false</include-initial-revisions><title-language>d482d98f-92b7-46da-87e0-1db6d574e01c|en</title-language><sort-column>TITLE</sort-column><ascending>true</ascending><sort-language>d482d98f-92b7-46da-87e0-1db6d574e01c|en</sort-language><sort-locale>sv-SE</sort-locale></sub-query></query>",
                  "columns" : [ "title", "revision" ],
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "Models"
                    },
                    "6c69f135-f87a-46db-bad5-abf7d7ae4f55" : {
                      "title" : "Modeller"
                    }
                  },
                  "resultType" : "MODEL"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/lists" : {
      "get" : {
        "tags" : [ "Lists" ],
        "summary" : "List lists",
        "description" : "Retrieve all lists in a repository",
        "operationId" : "getLists",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbListDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 12,
                  "data" : [ {
                    "uuid" : "418770e8-686e-4d77-af87-98930b289a9c",
                    "queryXml" : "<?xml version=\"1.0\" encoding=\"UTF-8\"?><query><sub-query query-type=\"se.conciliate.mt.store.MTDocumentSourceQueryImpl\" result-type=\"se.conciliate.extensions.documents.Document\"><contexts/><select-all>true</select-all><select-unused>false</select-unused><title-language>6c69f135-f87a-46db-bad5-abf7d7ae4f55|sv</title-language><ascending>true</ascending><sort-language>6c69f135-f87a-46db-bad5-abf7d7ae4f55|sv</sort-language><sort-locale>sv-SE</sort-locale><sources>mt.documents</sources><sort-by>mt.title</sort-by></sub-query></query>",
                    "columns" : [ "title" ],
                    "titles" : {
                      "40851ca2-dda5-455d-a9ef-05fd3f7c4ab7" : {
                        "title" : "All Documents"
                      },
                      "2b362bd1-86e7-4e21-bd2a-ee21209c95d6" : {
                        "title" : "All Documents"
                      },
                      "e74c5647-99b3-454f-9fe2-6ae5c987b9c6" : {
                        "title" : "All Documents"
                      }
                    },
                    "resultType" : "DOCUMENT"
                  }, {
                    "uuid" : "afed1d5e-8837-4b50-a6e7-6f7181168756",
                    "queryXml" : "<?xml version=\"1.0\" encoding=\"UTF-8\"?><query><sub-query query-type=\"se.conciliate.mt.store.MTDocumentSourceQueryImpl\" result-type=\"se.conciliate.extensions.documents.Document\"><contexts/><select-all>true</select-all><select-unused>false</select-unused><include-no-document-types>false</include-no-document-types><title-language>6c69f135-f87a-46db-bad5-abf7d7ae4f55|sv</title-language><ascending>true</ascending><sort-language>6c69f135-f87a-46db-bad5-abf7d7ae4f55|sv</sort-language><sort-locale>sv-SE</sort-locale><sources>mt.documents</sources><sort-by>mt.title</sort-by><document-filter filter-type=\"mt.filter.docTypes\">1e5e3b98-ffa4-4e19-9206-f37ee762bb4e</document-filter></sub-query></query>",
                    "columns" : [ "title" ],
                    "titles" : {
                      "40851ca2-dda5-455d-a9ef-05fd3f7c4ab7" : {
                        "title" : "Checklists"
                      },
                      "2b362bd1-86e7-4e21-bd2a-ee21209c95d6" : {
                        "title" : "Checklists"
                      },
                      "e74c5647-99b3-454f-9fe2-6ae5c987b9c6" : {
                        "title" : "Checklists"
                      }
                    },
                    "resultType" : "DOCUMENT"
                  }, {
                    "uuid" : "074cc3ea-54c2-4fa2-8f56-ae834a83c93d",
                    "queryXml" : "<?xml version=\"1.0\" encoding=\"UTF-8\"?><query><sub-query query-type=\"se.conciliate.mt.store.MTModelQueryImpl\" result-type=\"se.conciliate.extensions.store.MTModel\"><contexts/><select-all>true</select-all><select-subset>false</select-subset><owning-subset>false</owning-subset><only-locked-revisions>false</only-locked-revisions><include-initial-revisions>false</include-initial-revisions><title-language>d482d98f-92b7-46da-87e0-1db6d574e01c|en</title-language><sort-column>TITLE</sort-column><ascending>true</ascending><sort-language>d482d98f-92b7-46da-87e0-1db6d574e01c|en</sort-language><sort-locale>sv-SE</sort-locale></sub-query></query>",
                    "columns" : [ "title", "revision" ],
                    "titles" : {
                      "40851ca2-dda5-455d-a9ef-05fd3f7c4ab7" : {
                        "title" : "Models"
                      },
                      "2b362bd1-86e7-4e21-bd2a-ee21209c95d6" : {
                        "title" : "Models"
                      },
                      "e74c5647-99b3-454f-9fe2-6ae5c987b9c6" : {
                        "title" : "Models"
                      }
                    },
                    "resultType" : "MODEL"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/mt-documents" : {
      "post" : {
        "tags" : [ "Documents" ],
        "summary" : "Create a new MT document",
        "description" : "Creates a new MT document in the specified repository. The `group` field uses a customer-group UUID as permission-group selector. If `group` is omitted, the request-scoped `2c8-Permission-Group` header is used when present, otherwise the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` is applied.",
        "operationId" : "createMTDocument",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "2c8-Permission-Group",
          "in" : "header",
          "description" : "Optional customer-group UUID used as permission-group selector when the request body does not provide `group`. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "description" : "The document to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDocumentDto"
              },
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "languages" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "TITLE_EN_01",
                        "content" : "html or url",
                        "translated" : false
                      }
                    },
                    "type" : "URL"
                  }
                },
                "With additional properties" : {
                  "description" : "With additional properties",
                  "value" : {
                    "languages" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "TITLE_EN_01",
                        "content" : "html or url",
                        "translated" : false
                      }
                    },
                    "type" : "URL",
                    "documentTypes" : [ "1e5e3b98-ffa4-4e19-9206-f37ee762bb4e", "c0d8cdc6-9d67-42f0-ac3b-76d6b228ac81" ],
                    "prefix" : "prefix11",
                    "prefix_locked" : false,
                    "icon" : "/api/v1/icons/document_empty1111.png?size=16",
                    "copyOnPublish" : true,
                    "showInPanel" : false,
                    "responsible" : "36c96100-ac2c-4813-b25d-308d2969cbb8",
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "group" : "e033ad6f-e1da-423e-bbcc-f389a5481f7c"
                  }
                }
              }
            }
          }
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDocumentDto"
                },
                "example" : {
                  "uuid" : "21d8611f-7dc7-41ba-9b6b-929bbaef0b88",
                  "languages" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "TITLE_EN_01",
                      "content" : "html or url",
                      "translated" : false
                    }
                  },
                  "type" : "URL",
                  "documentTypes" : [ "1e5e3b98-ffa4-4e19-9206-f37ee762bb4e", "c0d8cdc6-9d67-42f0-ac3b-76d6b228ac81" ],
                  "prefix" : "prefix11",
                  "icon" : "/api/v1/icons/document_empty1111.png?size=16",
                  "copyOnPublish" : true,
                  "showInPanel" : false,
                  "responsible" : "36c96100-ac2c-4813-b25d-308d2969cbb8",
                  "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "group" : "b710b349-673b-4608-9abb-27afd634dbab",
                  "prefix_locked" : false
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/mt-documents/{documentId}" : {
      "patch" : {
        "tags" : [ "Documents" ],
        "summary" : "Update an existing MT document",
        "description" : "Updates an existing MT document with the provided properties. The `group` field uses a customer-group UUID as permission-group selector. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group. Changing `group` also resets the six stored permission flags from that permission-group template.",
        "operationId" : "updateMTDocument",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "documentId",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "The document to update",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDocumentDto"
              },
              "examples" : {
                "Update document languages" : {
                  "description" : "Update document languages",
                  "value" : {
                    "languages" : {
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                        "title" : "LANG SW",
                        "content" : "content 1",
                        "translated" : true
                      }
                    }
                  }
                },
                "Update document data type" : {
                  "description" : "Update document data type",
                  "value" : {
                    "type" : "MANAGED"
                  }
                },
                "Update document types" : {
                  "description" : "Update document types",
                  "value" : {
                    "documentTypes" : [ "c76651a3-e680-407b-83dc-1fa22b2c90ff" ]
                  }
                },
                "Update prefix" : {
                  "description" : "Update prefix",
                  "value" : {
                    "prefix" : "New prefix"
                  }
                },
                "Update prefix locked" : {
                  "description" : "Update prefix locked",
                  "value" : {
                    "prefix_locked" : false
                  }
                },
                "Update icon" : {
                  "description" : "Update icon",
                  "value" : {
                    "icon" : "/api/v1/icons/document_empty1111.png?size=16"
                  }
                },
                "Update copy on publish" : {
                  "description" : "Update copy on publish",
                  "value" : {
                    "copyOnPublish" : false
                  }
                },
                "Update show in panel" : {
                  "description" : "Update show in panel",
                  "value" : {
                    "showInPanel" : true
                  }
                },
                "Update responsible" : {
                  "description" : "Update responsible",
                  "value" : {
                    "responsible" : "69439d4c-9997-4eae-9209-fb8c83f258d5"
                  }
                },
                "Update owner" : {
                  "description" : "Update owner",
                  "value" : {
                    "owner" : "9d9e880b-64dc-4067-80df-759d8d5c7e82"
                  }
                },
                "Update group" : {
                  "description" : "Update group",
                  "value" : {
                    "group" : "e033ad6f-e1da-423e-bbcc-f389a5481f7c"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/matrices" : {
      "get" : {
        "tags" : [ "Matrices" ],
        "summary" : "List matrices",
        "description" : "Retrieve a paginated list of matrices for a repository. Note: These are stored as plugin data.",
        "operationId" : "getMatrices",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbMatrixDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "89dd34f3-85ba-4870-a0ea-349682b74094",
                    "hideEmpty" : true,
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "Responsibility matrix"
                    },
                    "relations" : [ {
                      "type" : "RELATIONS",
                      "defaultIcon" : false,
                      "iconURLByLanguage" : {
                        "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "A",
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "A"
                      },
                      "edgeType" : "RACI_ACCOUNTABLE"
                    }, {
                      "type" : "RELATIONS",
                      "defaultIcon" : false,
                      "iconURLByLanguage" : {
                        "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "R",
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "R"
                      },
                      "edgeType" : "RACI_RESPONSIBLE"
                    }, {
                      "type" : "RELATIONS",
                      "defaultIcon" : false,
                      "iconURLByLanguage" : {
                        "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "C",
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "C"
                      },
                      "edgeType" : "RACI_CONSULTANT"
                    }, {
                      "type" : "RELATIONS",
                      "defaultIcon" : false,
                      "iconURLByLanguage" : {
                        "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "I",
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "I"
                      },
                      "edgeType" : "RACI_INFORMED"
                    } ],
                    "xqueryGrouping" : "MODEL",
                    "yqueryGrouping" : "NONE",
                    "xlist" : "38d32154-011d-4216-bdbf-54d2ba5f2171",
                    "ylist" : "beddff7f-2e39-4858-99d1-3829ed0b25fb",
                    "xcolors" : [ "#FABB00", "#C9D34C", "#FFDD00", "rgb(220, 50, 0)", "rgb(112, 103, 135)" ]
                  } ]
                }
              }
            }
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Matrices" ],
        "summary" : "Create a new matrix",
        "description" : "Creates a new matrix configuration. This will be stored as XML in the repository plugin data.",
        "operationId" : "createMatrix",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "Matrix data to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbMatrixDto"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbMatrixDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/matrices/{matrixId}" : {
      "get" : {
        "tags" : [ "Matrices" ],
        "summary" : "Get a specific matrix",
        "description" : "Retrieve a specific matrix by its UUID.",
        "operationId" : "getMatrix",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "matrixId",
          "in" : "path",
          "description" : "The UUID of the matrix.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "a47a3dc6-ac54-4025-8d6d-6a4491c369dc"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbMatrixDto"
                },
                "example" : {
                  "uuid" : "89dd34f3-85ba-4870-a0ea-349682b74094",
                  "hideEmpty" : true,
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "Responsibility matrix"
                  },
                  "relations" : [ {
                    "type" : "RELATIONS",
                    "defaultIcon" : false,
                    "iconURLByLanguage" : {
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "A",
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "A"
                    },
                    "edgeType" : "RACI_ACCOUNTABLE"
                  }, {
                    "type" : "RELATIONS",
                    "defaultIcon" : false,
                    "iconURLByLanguage" : {
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "R",
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "R"
                    },
                    "edgeType" : "RACI_RESPONSIBLE"
                  }, {
                    "type" : "RELATIONS",
                    "defaultIcon" : false,
                    "iconURLByLanguage" : {
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "C",
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "C"
                    },
                    "edgeType" : "RACI_CONSULTANT"
                  }, {
                    "type" : "RELATIONS",
                    "defaultIcon" : false,
                    "iconURLByLanguage" : {
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : "I",
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : "I"
                    },
                    "edgeType" : "RACI_INFORMED"
                  } ],
                  "xqueryGrouping" : "MODEL",
                  "yqueryGrouping" : "NONE",
                  "xlist" : "38d32154-011d-4216-bdbf-54d2ba5f2171",
                  "ylist" : "beddff7f-2e39-4858-99d1-3829ed0b25fb",
                  "xcolors" : [ "#FABB00", "#C9D34C", "#FFDD00", "rgb(220, 50, 0)", "rgb(112, 103, 135)" ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Matrices" ],
        "summary" : "Delete a matrix",
        "description" : "Deletes a specific matrix configuration from the repository plugin data.",
        "operationId" : "deleteMatrix",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "matrixId",
          "in" : "path",
          "description" : "The UUID of the matrix.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "a47a3dc6-ac54-4025-8d6d-6a4491c369dc"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Matrices" ],
        "summary" : "Update an existing matrix",
        "description" : "Updates an existing matrix configuration. Fields are wrapped in InputField to support partial updates.",
        "operationId" : "updateMatrix",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "matrixId",
          "in" : "path",
          "description" : "The UUID of the matrix.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "a47a3dc6-ac54-4025-8d6d-6a4491c369dc"
        } ],
        "requestBody" : {
          "description" : "Matrix data to update",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbMatrixDto"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/matrices/{matrixId}/execute" : {
      "post" : {
        "tags" : [ "Matrices" ],
        "summary" : "Execute a matrix",
        "description" : "Executes the matrix query based on the current context.",
        "operationId" : "executeMatrix",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "matrixId",
          "in" : "path",
          "description" : "The UUID of the matrix.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "a47a3dc6-ac54-4025-8d6d-6a4491c369dc"
        } ],
        "requestBody" : {
          "description" : "Execution context (model context, revisions, language)",
          "content" : {
            "*/*" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbExecuteMatrixDto"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "Matrix execution successful.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbMatrixResultDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/model-contexts/{modelContextId}" : {
      "get" : {
        "tags" : [ "Model contexts" ],
        "summary" : "Get a model context by UUID",
        "description" : "Retrieves a specific model context from the repository using the context's UUID.",
        "operationId" : "getModelContext",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelContextId",
          "in" : "path",
          "description" : "The UUID of the model context.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "responses" : {
          "200" : {
            "description" : "Ok. Model context retrieved successfully",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbModelContextDto"
                },
                "example" : {
                  "uuid" : "3b71f004-b2cd-4dc8-b698-b49f78cd07bf",
                  "repository" : "603055e8-4734-461e-bf42-d4456afe7bb7",
                  "models" : [ {
                    "uuid" : "06353c34-78bd-4a9b-8ef1-ec5826e2ea95",
                    "version" : "1"
                  }, {
                    "uuid" : "df61e0aa-96d7-4061-8954-007a297e6b72",
                    "version" : "1"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "put" : {
        "tags" : [ "Model contexts" ],
        "summary" : "Update an existing model context",
        "description" : "Updates a model context, identified by its UUID, with a new list of MtbModelVersionDto.",
        "operationId" : "updateModelContext",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelContextId",
          "in" : "path",
          "description" : "The UUID of the model context.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "requestBody" : {
          "description" : "JSON array of MtbModelVersionDto objects representing the updated models",
          "content" : {
            "application/json" : {
              "schema" : {
                "type" : "array",
                "items" : {
                  "$ref" : "#/components/schemas/MtbModelVersionDto"
                }
              },
              "examples" : {
                "Example Update" : {
                  "summary" : "Update context models",
                  "description" : "Replaces model list with one latest and one fixed version",
                  "value" : [ {
                    "uuid" : "c022603a-4d79-4b5e-a82e-ce1f2916b2c0",
                    "version" : "1"
                  }, {
                    "uuid" : "acfba35b-2f88-4319-beae-a4d6f23e716d",
                    "version" : "1"
                  } ]
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "Ok. Model context updated successfully",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbModelContextDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Model contexts" ],
        "summary" : "Delete a model context by UUID",
        "description" : "Removes the model context from the repository, identified by its UUID.",
        "operationId" : "deleteModelContext",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelContextId",
          "in" : "path",
          "description" : "The UUID of the model context.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/model-contexts" : {
      "get" : {
        "tags" : [ "Model contexts" ],
        "summary" : "List contexts for a specified repository",
        "description" : "Get all contexts for a specified repository",
        "operationId" : "getAllModelContexts",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional entity field to sort by: `id`, `uuid`, `repositoryID`. Names are case-sensitive. Omit to use `id`.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "schema" : {
            "type" : "integer",
            "format" : "int32",
            "default" : 0
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "schema" : {
            "type" : "integer",
            "format" : "int32",
            "default" : 10
          }
        }, {
          "name" : "ascending",
          "in" : "query",
          "schema" : {
            "type" : "boolean",
            "default" : true
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Ok. All model contexts for the specified repository retrieved successfully",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbModelContextDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 1,
                  "total" : 1,
                  "sortColumns" : "id",
                  "data" : [ {
                    "uuid" : "3b71f004-b2cd-4dc8-b698-b49f78cd07bf",
                    "repository" : "603055e8-4734-461e-bf42-d4456afe7bb7",
                    "models" : [ {
                      "uuid" : "06353c34-78bd-4a9b-8ef1-ec5826e2ea95",
                      "version" : "1"
                    }, {
                      "uuid" : "df61e0aa-96d7-4061-8954-007a297e6b72",
                      "version" : "1"
                    } ]
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Model contexts" ],
        "summary" : "Create a model context",
        "description" : "Create a model context for a specified repository from a JSON list of model DTOs",
        "operationId" : "postModelContext",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "JSON array of MtbModelVersionDto objects used to create a model context",
          "content" : {
            "application/json" : {
              "schema" : {
                "type" : "array",
                "items" : {
                  "$ref" : "#/components/schemas/MtbModelVersionDto"
                }
              },
              "examples" : {
                "Default" : {
                  "summary" : "Create context with two models",
                  "description" : "Typical payload with latest and fixed version",
                  "value" : [ {
                    "uuid" : "4356ced5-bd71-411a-aabc-0ed7d5c1dc2d",
                    "version" : "1"
                  }, {
                    "uuid" : "fd435031-2d43-49ef-bf29-52c2cd3ef92f",
                    "version" : "2"
                  } ]
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbModelContextDto"
                },
                "example" : {
                  "uuid" : "7d6c15cc-bb9f-4442-94d7-16c2698db8ef",
                  "repository" : "603055e8-4734-461e-bf42-d4456afe7bb7",
                  "models" : [ {
                    "uuid" : "c022603a-4d79-4b5e-a82e-ce1f2916b2c0",
                    "version" : "0"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/descriptions/{descriptionTypeId}" : {
      "get" : {
        "tags" : [ "Descriptions" ],
        "summary" : "Get a description",
        "description" : "Retrieve a specific description for a model",
        "operationId" : "getModelDescription",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated fields: `descriptionType`, `content`. Names are case-sensitive. Omit to include both fields. This endpoint does not support projections.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5b7fb1aa-a133-49dc-afd2-49117bec8e8b"
        }, {
          "name" : "descriptionTypeId",
          "in" : "path",
          "description" : "The UUID of the field (called a description type in the API).",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "a47a3dc6-ac54-4025-8d6d-6a4491c369dc"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDescriptionDto"
                },
                "example" : {
                  "descriptionType" : "4f394d93-0d4a-4b0c-b512-d96f193b9a5a",
                  "content" : {
                    "e89e5cf9-196b-4647-9734-9f3d03c789ff" : {
                      "translated" : false,
                      "text" : ""
                    },
                    "016ab13b-045c-4b6e-8e8e-0ae674135835" : {
                      "translated" : true,
                      "text" : "<html><body><p>some text</p></body></html>"
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Descriptions" ],
        "summary" : "Create or update a model description",
        "description" : "Saves a model description after checking repository and model access. A successful write updates the last-modified time of both the model and repository.",
        "operationId" : "updateModelDescription",
        "parameters" : [ {
          "name" : "descriptionTypeId",
          "in" : "path",
          "description" : "The UUID of the field (called a description type in the API).",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "Description content to save",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDescriptionDto"
              },
              "example" : {
                "content" : {
                  "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                    "text" : "updated-content-text-01"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "409" : {
            "description" : "There is a resource conflict. A resource may be locked or already exist."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/descriptions" : {
      "get" : {
        "tags" : [ "Descriptions" ],
        "summary" : "List descriptions",
        "description" : "Retrieve the descriptions of the specified model, grouped by description type with localized content.",
        "operationId" : "getModelDescriptions",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated fields: `descriptionType`, `content`. Names are case-sensitive. Omit to include both fields. This endpoint does not support projections.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "899be98d-ecd9-4733-b8a5-fea85961cbf6"
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDescriptionDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "descriptionType" : "4f394d93-0d4a-4b0c-b512-d96f193b9a5a",
                    "content" : {
                      "016ab13b-045c-4b6e-8e8e-0ae674135835" : {
                        "text" : "<html><body><p>some text</p></body></html>"
                      },
                      "e89e5cf9-196b-4647-9734-9f3d03c789ff" : {
                        "text" : "",
                        "translated" : false
                      }
                    }
                  }, {
                    "descriptionType" : "41adfda3-b4df-411f-b095-c0ed33b18a01",
                    "content" : {
                      "016ab13b-045c-4b6e-8e8e-0ae674135835" : {
                        "text" : "<html><body><p>some text</p></body></html>"
                      },
                      "e89e5cf9-196b-4647-9734-9f3d03c789ff" : {
                        "text" : "",
                        "translated" : false
                      }
                    }
                  }, {
                    "descriptionType" : "f21aef69-9772-49bd-b6c1-4f3e55fc3887",
                    "content" : { }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/plugin-data" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "List plugin data",
        "description" : "Retrieve all plugin data for a repository",
        "operationId" : "getPluginDatas",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `key`, `model`, `model.version`, `model.versionLocked`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.position`, `relations.relationType`, `relations.strong`, `root`, `textContent`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "key", "model", "model.version", "model.versionLocked", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.position", "relations.relationType", "relations.strong", "root", "textContent", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `content`, `key`, `model.version`, `model.versionLocked`, `plugin`, `root`, `textContent`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "key", "model.version", "model.versionLocked", "plugin", "root", "textContent", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.relationType`, `textContent`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.relationType`, `textContent`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.relationType", "textContent", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AttachedPluginDataPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "cd9f36c2-e49b-4806-af21-14df9d8d8ab9",
                    "plugin" : "4a904697-31a0-4d57-8a37-2d0bd0990e78",
                    "key" : "key-01",
                    "root" : false,
                    "relations" : [ { } ],
                    "content" : null,
                    "textContent" : null
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Create plugin data for a model",
        "description" : "Create a specific plugin data for a model in a repository",
        "operationId" : "createModelPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "requestBody" : {
          "description" : "Plugin data",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginDataDto"
              },
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "plugin" : "4a904697-31a0-4d57-8a37-2d0bd0990e78",
                    "key" : "key-01",
                    "root" : false
                  }
                },
                "With content" : {
                  "description" : "With content",
                  "value" : {
                    "plugin" : "4a904697-31a0-4d57-8a37-2d0bd0990e78",
                    "key" : "key-01",
                    "content" : "binary data",
                    "textContent" : "TEXT",
                    "root" : false
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginDataDto"
                },
                "example" : {
                  "uuid" : "e81d00f2-d807-4aae-8d27-dab3abfff7ef",
                  "plugin" : "4a904697-31a0-4d57-8a37-2d0bd0990e78",
                  "key" : "key-01",
                  "content" : null,
                  "textContent" : null,
                  "root" : false
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/plugin-data/{pluginDataId}" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Get plugin data",
        "description" : "Retrieve a specific plugin data for a repository",
        "operationId" : "getModelPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5c351ae6-d29c-4bd0-8a14-02401b663a1e"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `key`, `model`, `model.version`, `model.versionLocked`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.position`, `relations.relationType`, `relations.strong`, `root`, `textContent`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "key", "model", "model.version", "model.versionLocked", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.position", "relations.relationType", "relations.strong", "root", "textContent", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AttachedPluginDataView"
                },
                "example" : {
                  "uuid" : "cd9f36c2-e49b-4806-af21-14df9d8d8ab9",
                  "plugin" : "4a904697-31a0-4d57-8a37-2d0bd0990e78",
                  "key" : "key-01",
                  "root" : false,
                  "relations" : [ { } ],
                  "content" : null,
                  "textContent" : null
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Delete plugin data for a model",
        "description" : "Delete a specific plugin data for a model in a repository",
        "operationId" : "deleteModelPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Update plugin data for a model",
        "description" : "Update a specific plugin data for a model in a repository",
        "operationId" : "updateModelPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "requestBody" : {
          "description" : "Plugin data",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginDataDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "content" : "binary data",
                    "textContent" : "TEXT"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/plugin-data/{pluginDataId}/relations" : {
      "get" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "List plugin relations",
        "description" : "Retrieve a paginated list of plugin relations for a repository for a model",
        "operationId" : "getModelPluginRelations",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "2866e1c3-c2fe-4c41-8084-2c763ef749aa",
                    "target" : "f966b208-201a-4f6d-bc7e-4017b454e305",
                    "relationType" : "test-relation",
                    "position" : 1,
                    "strong" : false
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Create plugin relation for a model",
        "description" : "Create a specific plugin relation for a model in a repository",
        "operationId" : "createModelPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "requestBody" : {
          "description" : "MtbPluginRelationDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginRelationDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "target" : "c1190753-cc55-4247-b1f0-be5ad9fe86fd",
                    "relationType" : "custom-relation-01",
                    "position" : 1,
                    "strong" : true
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDto"
                },
                "example" : {
                  "uuid" : "bea544e9-38af-4c4a-8827-331fdc505a65",
                  "target" : "c1190753-cc55-4247-b1f0-be5ad9fe86fd",
                  "relationType" : "custom-relation-01",
                  "position" : 1,
                  "strong" : true
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/plugin-data/{pluginDataId}/relations/{pluginRelationId}" : {
      "get" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Get a plugin relation",
        "description" : "Retrieve a specific plugin relation for a model in a repository",
        "operationId" : "getModelPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fc9777a5-6b09-494b-a113-ebbea6a72d9a"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDto"
                },
                "example" : {
                  "uuid" : "2866e1c3-c2fe-4c41-8084-2c763ef749aa",
                  "target" : "f966b208-201a-4f6d-bc7e-4017b454e305",
                  "relationType" : "test-relation",
                  "position" : 1,
                  "strong" : false
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Delete plugin relation for a model",
        "description" : "Delete a specific plugin relation for a model in a repository",
        "operationId" : "deleteModelPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fc9777a5-6b09-494b-a113-ebbea6a72d9a"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Update plugin relation for a model",
        "description" : "Update a specific plugin relation for a model in a repository",
        "operationId" : "updateModelPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fc9777a5-6b09-494b-a113-ebbea6a72d9a"
        } ],
        "requestBody" : {
          "description" : "MtbPluginRelationDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginRelationDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "position" : 2
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/properties/{providerId}" : {
      "get" : {
        "tags" : [ "Models" ],
        "summary" : "List model properties",
        "description" : "Retrieve all model properties for a repository model",
        "operationId" : "getModelProperties",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `key`, `value`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `value`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `value`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "key" : "model-property",
                    "value" : "value 1"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/properties/{providerId}/{key}" : {
      "get" : {
        "tags" : [ "Models" ],
        "summary" : "Get the property of a model key",
        "description" : "Retrieve model property for a repository model key",
        "operationId" : "getModelProperty",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "key",
          "in" : "path",
          "description" : "The property key.",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyView"
                },
                "example" : {
                  "key" : "model-property",
                  "value" : "value 1"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/subscribers" : {
      "get" : {
        "tags" : [ "Model subscribers" ],
        "summary" : "List subscribers for a model",
        "description" : "Retrieve all subscribers for a model",
        "operationId" : "getModelSubscribers",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "899be98d-ecd9-4733-b8a5-fea85961cbf6"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `email`, `name`, `type`, `userId`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "email", "name", "type", "userId", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `type`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "type", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `email`, `name`, `type`, `userId`, `uuid`. Omit `filterFields` to search selected fields. This compound resource matches transformed field values, recursively searching associations. Non-string scalar values are matched as text.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `email`, `name`, `type`, `userId`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). This compound resource matches transformed field values, recursively searching associations. Non-string scalar values are matched as text. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "email", "name", "type", "userId", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ModelSubscriberPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "f85d86ac-1503-4556-a2e7-39e1449ac7e8",
                    "type" : "email",
                    "email" : "jdoe@email.com"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Model subscribers" ],
        "summary" : "Create a model subscriber",
        "description" : "Subscribe the subscriber with the provided id as a subscriber to the model",
        "operationId" : "postModelSubscriber",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "899be98d-ecd9-4733-b8a5-fea85961cbf6"
        } ],
        "requestBody" : {
          "description" : "MtbSubscriberDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbSubscriberDto"
              },
              "example" : {
                "uuid" : "f6fccbda-c826-4d61-91a1-4a8cd80ecbbc"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbSubscriberDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "409" : {
            "description" : "There is a resource conflict. A resource may be locked or already exist."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/subscribers/{subscriberId}" : {
      "get" : {
        "tags" : [ "Model subscribers" ],
        "summary" : "Get a subscriber for a model",
        "description" : "Retrieve a specific subscriber for a model",
        "operationId" : "getModelSubscriber",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        }, {
          "name" : "subscriberId",
          "in" : "path",
          "description" : "The UUID of the subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d925a195-0ff6-4853-8f09-c37c21a1ed72"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `email`, `name`, `type`, `userId`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "email", "name", "type", "userId", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ModelSubscriberView"
                },
                "example" : {
                  "uuid" : "f85d86ac-1503-4556-a29b-c12f04e44c49",
                  "type" : "email",
                  "email" : "john.doe@2c8.com"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Model subscribers" ],
        "summary" : "Unsubscribe a model subscriber",
        "description" : "Unsubscribe the subscriber with the provided uuid from the model",
        "operationId" : "deleteModelSubscriber",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "899be98d-ecd9-4733-b8a5-fea85961cbf6"
        }, {
          "name" : "subscriberId",
          "in" : "path",
          "description" : "The UUID of the subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e76e9aec-4f22-442a-a0eb-f24985e0c231"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "409" : {
            "description" : "There is a resource conflict. A resource may be locked or already exist."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/versions" : {
      "get" : {
        "tags" : [ "Models" ],
        "summary" : "List model versions",
        "description" : "Retrieve all versions for a model",
        "operationId" : "getModelVersions",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "80c41767-0247-4f60-9d58-c5e925ff8585"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `message`, `model`, `model.version`, `newVersion`, `reason`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.model.version`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `trigger.symbol.version`, `user`, `user.user`, `workflowState`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "model", "model.version", "newVersion", "reason", "trigger", "trigger.model", "trigger.model.type", "trigger.model.uuid", "trigger.model.version", "trigger.symbol", "trigger.symbol.type", "trigger.symbol.uuid", "trigger.symbol.version", "user", "user.user", "workflowState" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `message`, `model.version`, `newVersion`, `reason`, `trigger.model.type`, `trigger.model.uuid`, `trigger.model.version`, `trigger.symbol.type`, `trigger.symbol.uuid`, `trigger.symbol.version`, `user.user`, `workflowState`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "model.version", "newVersion", "reason", "trigger.model.type", "trigger.model.uuid", "trigger.model.version", "trigger.symbol.type", "trigger.symbol.uuid", "trigger.symbol.version", "user.user", "workflowState" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `message`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `user`, `user.user`, `workflowState`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `message`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `user`, `user.user`, `workflowState`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "trigger", "trigger.model", "trigger.model.type", "trigger.model.uuid", "trigger.symbol", "trigger.symbol.type", "trigger.symbol.uuid", "user", "user.user", "workflowState" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/VersionPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "logItems" : [ {
                      "message" : "Model with id 6 removed from workspace with id 2",
                      "reason" : "CHANGES_IN_REVISION",
                      "workflowState" : null,
                      "newVersion" : false,
                      "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                      "version" : 0
                    } ],
                    "version" : 0
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Models" ],
        "summary" : "Create a new model version",
        "description" : "Create a new latest model version from the current latest version in the repository default snapshot.\n\nCreation is only allowed when the current latest version is both:\n- in workflow state APPROVED\n- revision locked\n\nThe new version:\n- is created as the next latest version\n- uses the current latest version as parent\n- starts in workflow state EDITABLE\n\nRequest rules:\n- message is optional\n- workflowState is not allowed in the request body\n",
        "operationId" : "createModelVersion",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        } ],
        "requestBody" : {
          "description" : "Request payload for creating a new model version.\n\nOnly message is supported here.\nIf provided, it is stored on the initial revision-log entry for the new version.\nworkflowState must be omitted.\n",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbModelVersionChangeDto"
              },
              "examples" : {
                "CreateVersionWithMessage" : {
                  "description" : "CreateVersionWithMessage",
                  "value" : {
                    "message" : "Starting a new revision"
                  }
                },
                "CreateVersionWithoutMessage" : {
                  "description" : "CreateVersionWithoutMessage",
                  "value" : { }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Model not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Models" ],
        "summary" : "Update the latest model version",
        "description" : "Update the current latest model version in the repository default snapshot.\n\nThis endpoint never creates a new version. It operates in-place on the current latest version and can be used to:\n- add a log message only\n- transition the latest version to a new workflow state\n- do both in the same request\n\nRequest rules:\n- at least one of message or workflowState must be provided\n- explicit null is rejected for both fields\n- workflowState transitions are validated against the workflow rules and the caller's permissions\n",
        "operationId" : "updateModelVersion",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        } ],
        "requestBody" : {
          "description" : "Request payload for updating the latest model version.\n\nUse message to append a revision-log entry.\nUse workflowState to request a workflow transition on the current latest version.\nProvide one or both.\n",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbModelVersionChangeDto"
              },
              "examples" : {
                "MessageOnly" : {
                  "description" : "MessageOnly",
                  "value" : {
                    "message" : "Clarified the calculations section"
                  }
                },
                "WorkflowTransitionOnly" : {
                  "description" : "WorkflowTransitionOnly",
                  "value" : {
                    "workflowState" : "UNDER_REVIEW"
                  }
                },
                "MessageAndWorkflowTransition" : {
                  "description" : "MessageAndWorkflowTransition",
                  "value" : {
                    "message" : "Ready for review",
                    "workflowState" : "UNDER_REVIEW"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Model not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/versions/{versionNumber}" : {
      "get" : {
        "tags" : [ "Models" ],
        "summary" : "Get a model version",
        "description" : "Retrieve a version for a model",
        "operationId" : "getModelVersion",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        }, {
          "name" : "versionNumber",
          "in" : "path",
          "description" : "The model version number.",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          },
          "example" : 1
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `message`, `model`, `model.version`, `newVersion`, `reason`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.model.version`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `trigger.symbol.version`, `user`, `user.user`, `workflowState`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "model", "model.version", "newVersion", "reason", "trigger", "trigger.model", "trigger.model.type", "trigger.model.uuid", "trigger.model.version", "trigger.symbol", "trigger.symbol.type", "trigger.symbol.uuid", "trigger.symbol.version", "user", "user.user", "workflowState" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/VersionView"
                },
                "example" : {
                  "logItems" : [ {
                    "message" : "Model with id 6 removed from workspace with id 2",
                    "reason" : "CHANGES_IN_REVISION",
                    "workflowState" : null,
                    "newVersion" : false,
                    "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "version" : 0
                  } ],
                  "version" : 0
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models" : {
      "get" : {
        "tags" : [ "Models" ],
        "summary" : "List models",
        "description" : "Retrieve all models for a repository",
        "operationId" : "getModels",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `allRead`, `allWrite`, `alternativeId`, `created`, `createdBy`, `documents`, `group`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy`, `locked`, `lockedBy`, `modelType`, `notify`, `owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `titles`, `uuid`, `version`, `versionLocked`, `workflowState`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "allRead", "allWrite", "alternativeId", "created", "createdBy", "documents", "group", "groupRead", "groupWrite", "historyEdited", "historyPath", "lastModified", "lastModifiedBy", "locked", "lockedBy", "modelType", "notify", "owner", "ownerRead", "ownerWrite", "parentVersion", "prefix", "prefixLocked", "titles", "uuid", "version", "versionLocked", "workflowState" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `allRead`, `allWrite`, `alternativeId`, `created`, `createdBy.createdBy`, `group.group`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy.lastModifiedBy`, `locked`, `lockedBy`, `modelType`, `notify`, `owner.owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `uuid`, `version`, `versionLocked`, `workflowState`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "allRead", "allWrite", "alternativeId", "created", "createdBy.createdBy", "group.group", "groupRead", "groupWrite", "historyEdited", "historyPath", "lastModified", "lastModifiedBy.lastModifiedBy", "locked", "lockedBy", "modelType", "notify", "owner.owner", "ownerRead", "ownerWrite", "parentVersion", "prefix", "prefixLocked", "uuid", "version", "versionLocked", "workflowState", "titles.title" ],
          "x-2c8-localized-sort-values" : [ "titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `allRead`, `allWrite`, `alternativeId`, `created`, `createdBy`, `documents`, `group`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy`, `locked`, `lockedBy`, `modelType`, `notify`, `owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `titles`, `uuid`, `version`, `versionLocked`, `workflowState`. Omit `filterFields` to search selected fields. This compound resource matches transformed field values, recursively searching associations. Non-string scalar values are matched as text.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `allRead`, `allWrite`, `alternativeId`, `created`, `createdBy`, `documents`, `group`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy`, `locked`, `lockedBy`, `modelType`, `notify`, `owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `titles`, `uuid`, `version`, `versionLocked`, `workflowState`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). This compound resource matches transformed field values, recursively searching associations. Non-string scalar values are matched as text. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "allRead", "allWrite", "alternativeId", "created", "createdBy", "documents", "group", "groupRead", "groupWrite", "historyEdited", "historyPath", "lastModified", "lastModifiedBy", "locked", "lockedBy", "modelType", "notify", "owner", "ownerRead", "ownerWrite", "parentVersion", "prefix", "prefixLocked", "titles", "uuid", "version", "versionLocked", "workflowState" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ModelPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 12,
                  "data" : [ {
                    "uuid" : "c022603a-4d79-4b5e-a82e-ce1f2916b2c0",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "m1"
                      }
                    },
                    "modelType" : "GENERAL_MODEL",
                    "alternativeId" : null,
                    "workflowState" : "EDITABLE",
                    "parentVersion" : null,
                    "version" : 0,
                    "versionLocked" : false,
                    "prefix" : null,
                    "prefixLocked" : false,
                    "documents" : [ ],
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                    "ownerRead" : true,
                    "ownerWrite" : true,
                    "groupRead" : true,
                    "groupWrite" : true,
                    "allRead" : true,
                    "allWrite" : false,
                    "notify" : false,
                    "locked" : "2026-02-11T09:09:06Z",
                    "lockedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "created" : "2026-02-11T09:02:32Z",
                    "createdBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "lastModified" : "2026-02-11T09:03:24Z",
                    "lastModifiedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "historyEdited" : true,
                    "historyPath" : null
                  }, {
                    "uuid" : "e034ed1a-c3ec-4309-b60a-f87c452683fd",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "n1"
                      }
                    },
                    "modelType" : "GENERAL_MODEL",
                    "alternativeId" : null,
                    "workflowState" : "EDITABLE",
                    "parentVersion" : null,
                    "version" : 0,
                    "versionLocked" : false,
                    "prefix" : null,
                    "prefixLocked" : false,
                    "documents" : [ ],
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                    "ownerRead" : true,
                    "ownerWrite" : true,
                    "groupRead" : true,
                    "groupWrite" : true,
                    "allRead" : true,
                    "allWrite" : false,
                    "notify" : false,
                    "locked" : "2026-02-12T12:26:42Z",
                    "lockedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "created" : "2026-02-11T09:02:37Z",
                    "createdBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "lastModified" : "2026-02-11T09:04:16Z",
                    "lastModifiedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "historyEdited" : true,
                    "historyPath" : null
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Models" ],
        "summary" : "Create a model",
        "description" : "Create a model. The `group` field and the `2c8-Permission-Group` header use customer-group UUIDs. If both are provided, the request body `group` takes precedence. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
        "operationId" : "createModel",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "2c8-Permission-Group",
          "in" : "header",
          "description" : "Optional customer-group UUID used as permission-group selector when the request body does not provide `group`. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "Models",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbModelDto"
              },
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "m1"
                      }
                    },
                    "modelType" : "GENERAL_MODEL"
                  }
                },
                "With additional properties" : {
                  "description" : "With additional properties",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "m1"
                      }
                    },
                    "modelType" : "GENERAL_MODEL",
                    "alternativeId" : "alt_text",
                    "prefix" : "prefix_01",
                    "prefixLocked" : false,
                    "documents" : [ {
                      "source" : "7d8f85e4-88b3-4818-82f0-92b3c51a59c1",
                      "id" : "9e7fb3fc-bf2b-435f-89aa-e3ea95cd297c"
                    } ],
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "group" : "e033ad6f-e1da-423e-bbcc-f389a5481f7c",
                    "notify" : false
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbModelDto"
                },
                "example" : {
                  "uuid" : "c95b1199-014d-426e-8e43-46739346faac",
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "m1",
                      "translated" : false
                    }
                  },
                  "modelType" : "GENERAL_MODEL",
                  "alternativeId" : null,
                  "prefix" : null,
                  "prefixLocked" : false,
                  "documents" : [ ],
                  "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                  "ownerRead" : true,
                  "ownerWrite" : true,
                  "groupRead" : true,
                  "groupWrite" : true,
                  "allRead" : true,
                  "allWrite" : false,
                  "notify" : false,
                  "subscribers" : [ ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}" : {
      "get" : {
        "tags" : [ "Models" ],
        "summary" : "Get a model",
        "description" : "Retrieve a specific model for a repository",
        "operationId" : "getModel",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `allRead`, `allWrite`, `alternativeId`, `created`, `createdBy`, `documents`, `group`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy`, `locked`, `lockedBy`, `modelType`, `notify`, `owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `titles`, `uuid`, `version`, `versionLocked`, `workflowState`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "allRead", "allWrite", "alternativeId", "created", "createdBy", "documents", "group", "groupRead", "groupWrite", "historyEdited", "historyPath", "lastModified", "lastModifiedBy", "locked", "lockedBy", "modelType", "notify", "owner", "ownerRead", "ownerWrite", "parentVersion", "prefix", "prefixLocked", "titles", "uuid", "version", "versionLocked", "workflowState" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ModelView"
                },
                "example" : {
                  "uuid" : "c022603a-4d79-4b5e-a82e-ce1f2916b2c0",
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "m1"
                    }
                  },
                  "modelType" : "GENERAL_MODEL",
                  "alternativeId" : null,
                  "workflowState" : "EDITABLE",
                  "parentVersion" : null,
                  "version" : 0,
                  "versionLocked" : false,
                  "prefix" : null,
                  "prefixLocked" : false,
                  "documents" : [ ],
                  "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                  "ownerRead" : true,
                  "ownerWrite" : true,
                  "groupRead" : true,
                  "groupWrite" : true,
                  "allRead" : true,
                  "allWrite" : false,
                  "notify" : false,
                  "locked" : "2026-02-11T09:09:06Z",
                  "lockedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "created" : "2026-02-11T09:02:32Z",
                  "createdBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "lastModified" : "2026-02-11T09:03:24Z",
                  "lastModifiedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "historyEdited" : true,
                  "historyPath" : [ "c022603a-4d79-4b5e-a82e-ce1f2916b2c0", "e034ed1a-c3ec-4309-b60a-f87c452683fd" ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Models" ],
        "summary" : "Delete a model",
        "description" : "Delete a model",
        "operationId" : "deleteModel",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Models" ],
        "summary" : "Update a model",
        "description" : "Update a model. The `group` field uses a customer-group UUID as permission-group selector. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group. Changing `group` also resets the six stored permission flags from that permission-group template.",
        "operationId" : "updateModel",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        } ],
        "requestBody" : {
          "description" : "Models",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbModelDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "m11"
                      }
                    },
                    "modelType" : "PROCESS_MODEL",
                    "alternativeId" : null,
                    "prefix" : null,
                    "prefixLocked" : false,
                    "documents" : [ ],
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                    "notify" : false
                  }
                },
                "Update titles" : {
                  "description" : "Update titles",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "New title"
                      }
                    }
                  }
                },
                "Update model type" : {
                  "description" : "Update model type",
                  "value" : {
                    "modelType" : "INTERESTED_PARTY_MODEL"
                  }
                },
                "Update reference id" : {
                  "description" : "Update reference id",
                  "value" : {
                    "alternativeId" : "alt_id_1"
                  }
                },
                "Update prefix" : {
                  "description" : "Update prefix",
                  "value" : {
                    "prefix" : "new prefix"
                  }
                },
                "Update prefix locked" : {
                  "description" : "Update prefix locked",
                  "value" : {
                    "prefixLocked" : true
                  }
                },
                "Update documents" : {
                  "description" : "Update documents",
                  "value" : {
                    "documents" : [ {
                      "source" : "source",
                      "id" : "source_id"
                    } ]
                  }
                },
                "Update owner" : {
                  "description" : "Update owner",
                  "value" : {
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52"
                  }
                },
                "Update group" : {
                  "description" : "Update group",
                  "value" : {
                    "group" : "b710b349-673b-4608-9abb-27afd634dbab"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/notifications" : {
      "get" : {
        "tags" : [ "Notifications" ],
        "summary" : "List notifications",
        "description" : "Retrieves all notifications for a model",
        "operationId" : "getNotifications",
        "parameters" : [ {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional entity field to sort by: `id`, `modelUuid`, `publishDate`, `revision`, `uuid`, `workflowState`. Names are case-sensitive. Omit to use `id`.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "schema" : {
            "type" : "integer",
            "format" : "int32",
            "default" : 0
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "schema" : {
            "type" : "integer",
            "format" : "int32",
            "default" : 10
          }
        }, {
          "name" : "ascending",
          "in" : "query",
          "schema" : {
            "type" : "boolean",
            "default" : true
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/MtbNotificationsDto"
                  }
                },
                "example" : [ {
                  "uuid" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0",
                  "workflowState" : "DRAFT",
                  "publishDate" : "2024-01-01T12:00:00Z",
                  "publication" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
                }, {
                  "uuid" : "7deb5020-aa77-47ab-8070-33c92f0270f1",
                  "workflowState" : "PUBLISHED",
                  "publishDate" : "2024-02-01T15:30:00Z",
                  "publication" : "603055e8-4734-461e-bf42-d4456afe7bb7"
                } ]
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details.",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorDto"
                },
                "example" : {
                  "message" : "Invalid request",
                  "timestamp" : "2026-09-11T10:00:00Z"
                }
              }
            }
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/notifications/{notificationId}" : {
      "get" : {
        "tags" : [ "Notifications" ],
        "summary" : "Get a notification by UUID",
        "description" : "Retrieves a specific notification for a model using the notification's UUID.",
        "operationId" : "getNotification",
        "parameters" : [ {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "notificationId",
          "in" : "path",
          "description" : "The UUID of the notification.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbNotificationsDto"
                },
                "example" : {
                  "uuid" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0",
                  "workflowState" : "DRAFT",
                  "publishDate" : "2024-01-01T12:00:00Z",
                  "publication" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/permission-groups" : {
      "get" : {
        "tags" : [ "Permission groups" ],
        "summary" : "List permission groups",
        "description" : "Retrieve all permission groups for a repository. The `group` field in the response is the customer-group UUID exposed to API clients.",
        "operationId" : "getPermissionGroups",
        "parameters" : [ {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPermissionGroupDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "28d1924a-147a-4b85-b4bf-f0e4461fc94b",
                    "group" : {
                      "uuid" : "b710b349-673b-4608-9abb-27afd634dbab",
                      "name" : "Group A"
                    },
                    "permissions" : {
                      "ownerRead" : true,
                      "ownerWrite" : true,
                      "groupRead" : true,
                      "groupWrite" : true,
                      "allRead" : true,
                      "allWrite" : true
                    }
                  }, {
                    "uuid" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                    "group" : {
                      "uuid" : null,
                      "name" : "All users"
                    },
                    "permissions" : {
                      "ownerRead" : true,
                      "ownerWrite" : true,
                      "groupRead" : true,
                      "groupWrite" : true,
                      "allRead" : true,
                      "allWrite" : false
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Permission groups" ],
        "summary" : "Create a permission group",
        "description" : "Create a new permission group for a repository. The request `group` field is a customer-group UUID.",
        "operationId" : "createPermissionGroup",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "Create permission group using a customer-group UUID in the `group` field.",
          "content" : {
            "application/json" : {
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "group" : {
                      "uuid" : "b710b349-673b-4608-9abb-27afd634dbab"
                    },
                    "permissions" : {
                      "ownerRead" : true,
                      "ownerWrite" : true,
                      "groupRead" : true,
                      "groupWrite" : true,
                      "allRead" : true,
                      "allWrite" : true
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPermissionGroupDto"
                },
                "example" : {
                  "uuid" : "28d1924a-147a-4b85-b4bf-f0e4461fc94b",
                  "group" : {
                    "uuid" : "b710b349-673b-4608-9abb-27afd634dbab",
                    "name" : "Group A"
                  },
                  "permissions" : {
                    "ownerRead" : true,
                    "ownerWrite" : true,
                    "groupRead" : true,
                    "groupWrite" : true,
                    "allRead" : true,
                    "allWrite" : true
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/permission-groups/{permissionGroupId}" : {
      "get" : {
        "tags" : [ "Permission groups" ],
        "summary" : "Get a permission group",
        "description" : "Retrieve a specific permission group for a repository. The `group` field in the response is the customer-group UUID exposed to API clients.",
        "operationId" : "getPermissionGroup",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "permissionGroupId",
          "in" : "path",
          "description" : "The UUID of the permission-group resource, not the customer-group UUID returned in its `group` field.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e1baf007-79da-4d94-a7db-fe09b56333e0"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPermissionGroupDto"
                },
                "example" : {
                  "uuid" : "28d1924a-147a-4b85-b4bf-f0e4461fc94b",
                  "group" : {
                    "uuid" : "b710b349-673b-4608-9abb-27afd634dbab",
                    "name" : "Group A"
                  },
                  "permissions" : {
                    "ownerRead" : true,
                    "ownerWrite" : true,
                    "groupRead" : true,
                    "groupWrite" : true,
                    "allRead" : true,
                    "allWrite" : true
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Permission groups" ],
        "summary" : "Delete a permission group",
        "description" : "Delete an existing permission group from a repository by permission-group UUID.",
        "operationId" : "deletePermissionGroup",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "permissionGroupId",
          "in" : "path",
          "description" : "The UUID of the permission-group resource, not the customer-group UUID returned in its `group` field.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Permission groups" ],
        "summary" : "Update a permission group",
        "description" : "Update an existing permission group for a repository. The permission-group resource is selected by its own UUID, while the `group` field in the payload remains a customer-group UUID.",
        "operationId" : "updatePermissionGroup",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "permissionGroupId",
          "in" : "path",
          "description" : "The UUID of the permission-group resource, not the customer-group UUID returned in its `group` field.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "The fields to update for the permission group.",
          "content" : {
            "application/json" : {
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "permissions" : {
                      "ownerRead" : false,
                      "ownerWrite" : true,
                      "groupRead" : false,
                      "groupWrite" : true,
                      "allRead" : false,
                      "allWrite" : true
                    }
                  }
                },
                "Update only one permission" : {
                  "description" : "Update only one permission",
                  "value" : {
                    "permissions" : {
                      "ownerRead" : false
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/plugin-data" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "List plugin data",
        "description" : "Retrieve a list of all plugin data for a repository",
        "operationId" : "getPluginDataList",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.position`, `relations.relationType`, `relations.strong`, `root`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.position", "relations.relationType", "relations.strong", "root", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `key`, `plugin`, `root`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "plugin", "root", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.relationType`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.relationType`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.relationType", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PluginDataPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "c9e42b01-1ab1-4017-a056-732457c1c1e3",
                    "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                    "key" : "settings",
                    "root" : true,
                    "relations" : [ ]
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Create plugin data",
        "description" : "Creates a new plugin data associated with a specific repository.",
        "operationId" : "createPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "plugin data to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginDataDto"
              },
              "examples" : {
                "minimal" : {
                  "description" : "minimal",
                  "value" : {
                    "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                    "key" : "mt.docs",
                    "root" : true
                  }
                },
                "With additional properties" : {
                  "description" : "With additional properties",
                  "value" : {
                    "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                    "key" : "mt.docs",
                    "content" : "SGVsbG8gd29ybGQh",
                    "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>",
                    "root" : true
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginDataDto"
                },
                "example" : {
                  "uuid" : "c9e42b01-1ab1-4017-a056-732457c1c1e3",
                  "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                  "key" : "mt.docs",
                  "content" : "SGVsbG8gd29ybGQh",
                  "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>",
                  "root" : true
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/plugin-data/{pluginDataId}" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Get plugin data",
        "description" : "Retrieve a specific plugin data for a repository",
        "operationId" : "getPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.position`, `relations.relationType`, `relations.strong`, `root`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.position", "relations.relationType", "relations.strong", "root", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PluginDataView"
                },
                "example" : {
                  "uuid" : "c9e42b01-1ab1-4017-a056-732457c1c1e3",
                  "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                  "key" : "mt.docs",
                  "root" : true,
                  "relations" : [ {
                    "test-relation" : [ {
                      "uuid" : "19cb5362-246b-4e71-bf5f-1668ee14dfd4",
                      "strong" : false,
                      "position" : 1
                    } ],
                    "custom-relation" : [ {
                      "uuid" : "93e42c60-8419-11e3-baa7-0800200c9a66",
                      "strong" : true,
                      "position" : 1
                    } ]
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Delete plugin data",
        "description" : "Deletes a specific plugin data from a repository.",
        "operationId" : "deletePluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e5cbac72-b6b4-4193-a421-a61033e474b3"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Update an existing plugin data partially",
        "description" : "Applies a partial update to an existing plugin data. Only fields provided in the request body will be updated.",
        "operationId" : "updatePluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e5cbac72-b6b4-4193-a421-a61033e474b3"
        } ],
        "requestBody" : {
          "description" : "Plugin data fields to update.",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginDataDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "content" : "SGVsbG8gd29ybGQh",
                    "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>"
                  }
                },
                "Update only content" : {
                  "description" : "Update only content",
                  "value" : {
                    "content" : "SGVsbG8gd29ybGQh"
                  }
                },
                "update only text content" : {
                  "description" : "update only text content",
                  "value" : {
                    "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/plugin-data/{pluginDataId}/content" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Get plugin data binary content",
        "description" : "Retrieve the binary content for a specific plugin data in a repository",
        "operationId" : "getPluginDataContent",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/octet-stream" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/plugin-data/{pluginDataId}/text-content" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Get plugin data text content",
        "description" : "Retrieve the text content for a specific plugin data in a repository",
        "operationId" : "getPluginDataTextContent",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "text/plain" : {
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/plugin-data/{pluginDataId}/relations" : {
      "get" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Get plugin data relations",
        "description" : "Retrieves a list of relations for a specific plugin data item.",
        "operationId" : "getPluginDataRelations",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/MtbPluginRelationDto"
                  }
                },
                "example" : [ {
                  "uuid" : "2866e1c3-c2fe-4c41-8084-2c763ef749aa",
                  "target" : "f966b208-201a-4f6d-bc7e-4017b454e305",
                  "relationType" : "test-relation",
                  "position" : 1,
                  "strong" : false
                }, {
                  "uuid" : "0fd06dd3-bd40-4374-8d00-b1c3c644c3a4",
                  "target" : "c1190753-cc55-4247-b1f0-be5ad9fe86fd",
                  "relationType" : "custom-relation",
                  "position" : 1,
                  "strong" : true
                } ]
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Create a relation",
        "description" : "Creates a new relation for a specific plugin data item.",
        "operationId" : "createPluginDataRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginRelationDto"
              }
            }
          }
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDto"
                },
                "example" : {
                  "uuid" : "299aa6b8-d730-4baf-bc8f-5890d51407dd",
                  "target" : "c1190753-cc55-4247-b1f0-be5ad9fe86fd",
                  "relationType" : "custom-relation",
                  "position" : 1,
                  "strong" : true
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/plugin-data/{pluginDataId}/relations/{pluginRelationId}" : {
      "get" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Get a single relation",
        "description" : "Retrieves a specific relation by its UUID.",
        "operationId" : "getPluginDataRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDto"
                },
                "example" : {
                  "uuid" : "2866e1c3-c2fe-4c41-8084-2c763ef749aa",
                  "target" : "f966b208-201a-4f6d-bc7e-4017b454e305",
                  "relationType" : "test-relation",
                  "position" : 1,
                  "strong" : false
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Delete a relation",
        "operationId" : "deletePluginDataRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Update a relation",
        "description" : "Updates an existing relation for a specific plugin data item.",
        "operationId" : "updatePluginDataRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "The relation data to update.",
          "content" : {
            "application/json" : {
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "position" : 2
                  }
                }
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/publications/{publicationId}" : {
      "get" : {
        "tags" : [ "Publications" ],
        "summary" : "Get a publication",
        "description" : "Retrieve a specific publication for a repository",
        "operationId" : "getPublication",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "publicationId",
          "in" : "path",
          "description" : "The UUID of the publication.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "cd29f573-95be-4616-9246-d7bdb29970e1"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `baseUrl`, `notifications`, `notifications.model`, `notifications.revision`, `profileId`, `publishDate`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "baseUrl", "notifications", "notifications.model", "notifications.revision", "profileId", "publishDate", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PublicationView"
                },
                "example" : {
                  "uuid" : "cd29f573-95be-4616-9246-d7bdb29970e1",
                  "baseUrl" : "https://example.com/mt",
                  "profileId" : "https://example.com/mt/profile",
                  "publishDate" : "2024-01-01T12:00:00Z",
                  "notifications" : [ {
                    "revision" : 1,
                    "model" : "e7a1c9d2-3f4b-4a5c-8d6e-9f0a1b2c3d4e"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/publications" : {
      "get" : {
        "tags" : [ "Publications" ],
        "summary" : "List publications",
        "description" : "Retrieve all publications for a repository",
        "operationId" : "getPublications",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `baseUrl`, `notifications`, `notifications.model`, `notifications.revision`, `profileId`, `publishDate`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "baseUrl", "notifications", "notifications.model", "notifications.revision", "profileId", "publishDate", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `baseUrl`, `profileId`, `publishDate`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "baseUrl", "profileId", "publishDate", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `baseUrl`, `notifications`, `notifications.model`, `profileId`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `baseUrl`, `notifications`, `notifications.model`, `profileId`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "baseUrl", "notifications", "notifications.model", "profileId", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PublicationPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 25,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "cd29f573-95be-4616-9246-d7bdb29970e1",
                    "baseUrl" : "https://example.com/mt",
                    "profileId" : "https://example.com/mt/profile",
                    "publishDate" : "2024-01-01T12:00:00Z",
                    "notifications" : [ {
                      "revision" : 1,
                      "model" : "e7a1c9d2-3f4b-4a5c-8d6e-9f0a1b2c3d4e"
                    } ]
                  }, {
                    "uuid" : "ab12cd34-56ef-78ab-90cd-ef1234567890",
                    "baseUrl" : "https://example.org/mt",
                    "profileId" : "https://example.org/mt/profile",
                    "publishDate" : "2024-02-01T12:00:00Z",
                    "notifications" : [ {
                      "revision" : 2,
                      "model" : "f1a2b3c4-d5e6-7f8a-9b0c-1d2e3f4a5b6c"
                    } ]
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/publish-profiles/{publishProfileId}" : {
      "get" : {
        "tags" : [ "Publish profiles" ],
        "summary" : "Get a publish profile",
        "description" : "Retrieve a specific publish profile for a repository",
        "operationId" : "getPublishProfile",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "publishProfileId",
          "in" : "path",
          "description" : "The UUID of the publish profile.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e5cbac72-b6b4-4193-a421-a61033e474b3"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `description`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "description", "title", "type", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PublishProfileView"
                },
                "example" : {
                  "uuid" : "35b2b10f-e0e9-4a74-b69b-acb21593e07d",
                  "title" : "Rapportprofil",
                  "description" : "Rapportprofil med standardinställningar. (Standard 2c8)",
                  "type" : "2conciliate_report_profile"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/publish-profiles/{publishProfileId}/content" : {
      "get" : {
        "tags" : [ "Publish profiles" ],
        "summary" : "Get publish profile content",
        "operationId" : "getPublishProfileContent",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "publishProfileId",
          "in" : "path",
          "description" : "The UUID of the publish profile.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "2e52e159-ddc6-45fb-824f-086fd73338fe"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/octet-stream" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                },
                "example" : "UEsDBBQAAAAIAAAAAAAAAAAAAAAAAAAAAAA="
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/publish-profiles" : {
      "get" : {
        "tags" : [ "Publish profiles" ],
        "summary" : "List publish profiles",
        "description" : "Retrieve all publish profiles for a repository",
        "operationId" : "getPublishProfiles",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `description`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "description", "title", "type", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `description`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "description", "title", "type", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `description`, `title`, `type`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `description`, `title`, `type`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "description", "title", "type" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PublishProfilePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "35b2b10f-e0e9-4a74-b69b-acb21593e07d",
                    "title" : "Rapportprofil",
                    "description" : "Rapportprofil med standardinställningar. (Standard 2c8)",
                    "type" : "2conciliate_report_profile"
                  }, {
                    "uuid" : "05020b32-3e50-4516-baa4-158ac75c4e6d",
                    "title" : "Web profile",
                    "description" : "Publish models to HTML files viewable in a web browser.",
                    "type" : "2conciliate_pages_profile"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/publish-templates/{publishTemplateId}" : {
      "get" : {
        "tags" : [ "Publish templates" ],
        "summary" : "Get a publish template",
        "description" : "Retrieve a specific publish template.",
        "operationId" : "getPublishTemplate",
        "parameters" : [ {
          "name" : "publishTemplateId",
          "in" : "path",
          "description" : "The UUID of the publish template.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c677b732-fcf7-4a19-b396-ecaed8dd1448"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `default`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "default", "title", "type", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PublishTemplateView"
                },
                "example" : {
                  "uuid" : "35b2b10f-e0e9-4a74-b69b-acb21593e07d",
                  "title" : "Report template",
                  "type" : "2conciliate_report_profile",
                  "default" : false
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/publish-templates/{publishTemplateId}/content" : {
      "get" : {
        "tags" : [ "Publish templates" ],
        "summary" : "Get publish template content",
        "operationId" : "getPublishTemplateContent",
        "parameters" : [ {
          "name" : "publishTemplateId",
          "in" : "path",
          "description" : "The UUID of the publish template.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "3d1852bb-4e85-4955-a3ac-f34a83524951"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/octet-stream" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                },
                "example" : "    (binary content of the publish template)\n"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/publish-templates" : {
      "get" : {
        "tags" : [ "Publish templates" ],
        "summary" : "List publish templates",
        "description" : "Retrieve all publish templates.",
        "operationId" : "getPublishTemplates",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `default`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "default", "title", "type", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `default`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "default", "title", "type", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `title`, `type`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `title`, `type`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "title", "type", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PublishTemplatePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 25,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "c677b732-fcf7-4a19-b396-ecaed8dd1448",
                    "title" : "Default publish template",
                    "type" : "DEFAULT",
                    "default" : true
                  }, {
                    "uuid" : "3d1852bb-4e85-4955-a3ac-f34a83524951",
                    "title" : "Custom publish template",
                    "type" : "CUSTOM",
                    "default" : false
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/queries/execute" : {
      "post" : {
        "tags" : [ "Queries" ],
        "summary" : "Execute query",
        "description" : "Execute query",
        "operationId" : "executeQuery",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbExecuteQueryDto"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "200",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbQueryResultDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/relations/{relationId}/check" : {
      "post" : {
        "tags" : [ "Relations" ],
        "summary" : "Check existing custom relation script",
        "description" : "Check existing custom relation script",
        "operationId" : "checkExistingRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "relationId",
          "in" : "path",
          "description" : "The UUID of the custom relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "91d83b7e-755f-490d-b239-fc8c6da90741"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbCustomRelationDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/relations/check" : {
      "post" : {
        "tags" : [ "Relations" ],
        "summary" : "Check custom relation script",
        "description" : "Check custom relation script",
        "operationId" : "checkRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbCustomRelationDto"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbCustomRelationDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/relations" : {
      "get" : {
        "tags" : [ "Relations" ],
        "summary" : "List custom relations",
        "description" : "Retrieve all custom relations for a repository",
        "operationId" : "getRelations",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `actionObject`, `columns`, `historyEdited`, `historyPath`, `lastModified`, `repositoryEntity`, `script`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `uiGenerated`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "actionObject", "columns", "historyEdited", "historyPath", "lastModified", "repositoryEntity", "script", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.title", "titles.uuid", "uiGenerated", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `actionObject`, `columns`, `historyEdited`, `historyPath`, `lastModified`, `script`, `uiGenerated`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "actionObject", "columns", "historyEdited", "historyPath", "lastModified", "script", "uiGenerated", "uuid", "titles.title" ],
          "x-2c8-localized-sort-values" : [ "titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `actionObject`, `columns`, `historyPath`, `script`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `actionObject`, `columns`, `historyPath`, `script`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "actionObject", "columns", "historyPath", "script", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.title", "titles.uuid", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/CustomRelationPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "9f924603-856e-49fc-a26e-8aaf024e6b7d",
                    "titles" : { },
                    "actionObject" : "model",
                    "uiGenerated" : false,
                    "columns" : [ "col1" ],
                    "lastModified" : "2026-02-11T07:45:21Z",
                    "historyEdited" : false,
                    "historyPath" : null,
                    "script" : "script_01.txt"
                  }, {
                    "uuid" : "03f80a5a-0844-4311-81c8-ca6d51c45445",
                    "titles" : {
                      "1d95f20b-5ad4-434a-a218-0e93faf7969a" : {
                        "title" : "Title 1"
                      }
                    },
                    "actionObject" : "model",
                    "uiGenerated" : false,
                    "columns" : [ "col1" ],
                    "lastModified" : "2026-02-23T01:53:54Z",
                    "historyEdited" : true,
                    "historyPath" : null,
                    "script" : "script_01.txt"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Relations" ],
        "summary" : "Create a new custom relation",
        "description" : "Create a new custom relation",
        "operationId" : "createRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbCustomRelationDto"
              }
            }
          }
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbCustomRelationDto"
                },
                "examples" : {
                  "Default" : {
                    "description" : "Default",
                    "value" : {
                      "uuid" : "03f80a5a-0844-4311-81c8-ca6d51c45445",
                      "titles" : {
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                          "title" : "Title 1"
                        }
                      },
                      "actionObject" : "model",
                      "uiGenerated" : false,
                      "script" : "script_01.txt",
                      "compilable" : false,
                      "approvedVersions" : false,
                      "columns" : [ "col1" ]
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/relations/{relationId}" : {
      "get" : {
        "tags" : [ "Relations" ],
        "summary" : "Get a custom relation",
        "description" : "Retrieve a specific custom relation for a repository",
        "operationId" : "getRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "relationId",
          "in" : "path",
          "description" : "The UUID of the custom relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c4d0162c-836f-4fb2-a80c-330f167118ee"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `actionObject`, `columns`, `historyEdited`, `historyPath`, `lastModified`, `repositoryEntity`, `script`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.title`, `titles.uuid`, `uiGenerated`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "actionObject", "columns", "historyEdited", "historyPath", "lastModified", "repositoryEntity", "script", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.title", "titles.uuid", "uiGenerated", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/CustomRelationView"
                },
                "example" : {
                  "uuid" : "03f80a5a-0844-4311-81c8-ca6d51c45445",
                  "titles" : {
                    "1d95f20b-5ad4-434a-a218-0e93faf7969a" : {
                      "title" : "Title 1"
                    }
                  },
                  "actionObject" : "model",
                  "uiGenerated" : false,
                  "columns" : [ "col1" ],
                  "lastModified" : "2026-02-23T01:53:54Z",
                  "historyEdited" : true,
                  "historyPath" : null,
                  "script" : "script_01.txt"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Relations" ],
        "summary" : "Delete an existing custom relation",
        "description" : "Delete an existing custom relation",
        "operationId" : "deleteRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "relationId",
          "in" : "path",
          "description" : "The UUID of the custom relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Relations" ],
        "summary" : "Update an existing custom relation",
        "description" : "Update an existing custom relation",
        "operationId" : "updateRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "relationId",
          "in" : "path",
          "description" : "The UUID of the custom relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "Fields to be updated.",
          "content" : {
            "application/json" : {
              "examples" : {
                "Update titles" : {
                  "description" : "Update titles",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "New title 1",
                        "translated" : true
                      }
                    }
                  }
                },
                "Update action object" : {
                  "description" : "Update action object",
                  "value" : {
                    "actionObject" : "model"
                  }
                },
                "Update ui generated" : {
                  "description" : "Update ui generated",
                  "value" : {
                    "uiGenerated" : false
                  }
                },
                "Update columns" : {
                  "description" : "Update columns",
                  "value" : {
                    "columns" : [ "column1", "column2" ]
                  }
                },
                "Update script" : {
                  "description" : "Update script",
                  "value" : {
                    "script" : "new_script_01.txt"
                  }
                }
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/relations/{relationId}/execute" : {
      "post" : {
        "tags" : [ "Relations" ],
        "summary" : "Execute existing custom relation script",
        "description" : "Execute existing custom relation script",
        "operationId" : "executeExistingRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "relationId",
          "in" : "path",
          "description" : "The UUID of the custom relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60c02ee8-4814-44db-8d40-08ed78d14401"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbCustomRelationDto"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbCustomRelationDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/relations/execute" : {
      "post" : {
        "tags" : [ "Relations" ],
        "summary" : "Execute custom relation script",
        "description" : "Execute custom relation script",
        "operationId" : "executeRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbCustomRelationDto"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbCustomRelationDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/relations/{relationId}/script" : {
      "get" : {
        "tags" : [ "Relations" ],
        "summary" : "Get custom relation script",
        "description" : "Get custom relation script",
        "operationId" : "getScript",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "relationId",
          "in" : "path",
          "description" : "The UUID of the custom relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "7038693d-c8b1-4f3a-8ee3-7bbe13af41a4"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "text/plain" : {
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/report/{ReportJobId}/download" : {
      "get" : {
        "tags" : [ "Reports" ],
        "summary" : "Download the completed report file",
        "description" : "Download the generated file after the job reaches SUCCESS. The response is the file itself, not a JSON envelope. Content type follows the file extension: PDF, HTML, plain text for Markdown, or binary for other extensions.",
        "operationId" : "downloadReport",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The unique tracking identifier for the repository",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The unique tracking identifier for the model",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "ReportJobId",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Generated report file, returned as an attachment.",
            "headers" : {
              "Content-Disposition" : {
                "description" : "Attachment with filename report_<job UUID><file extension>.",
                "style" : "simple",
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Length" : {
                "description" : "File size in bytes.",
                "style" : "simple",
                "schema" : {
                  "minimum" : 0,
                  "type" : "integer",
                  "format" : "int64"
                }
              },
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/pdf" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              },
              "text/html" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              },
              "text/plain" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              },
              "application/octet-stream" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "400" : {
            "description" : "The job exists but its status is not SUCCESS. The body contains JSON text; this branch does not explicitly set its media type.",
            "content" : {
              "*/*" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ReportDownloadError"
                },
                "example" : {
                  "error" : "Report execution status is PROCESSING"
                }
              }
            }
          },
          "403" : {
            "description" : "Access denied. The resource returns an unquoted text message labeled application/json; read it as text rather than assuming a JSON object.",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "404" : {
            "description" : "The job, file path or generated file was not found. No response body."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/report" : {
      "post" : {
        "tags" : [ "Reports" ],
        "summary" : "Trigger async report generation",
        "description" : "Instantly commits a tracking record to the database and offloads the intensive compiling tasks to a background container thread pool.",
        "operationId" : "startReportGeneration",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The unique tracking identifier for the repository",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The unique tracking identifier for the model",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "languageUuid",
          "in" : "query",
          "description" : "The target language translation unique identifier",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "format",
          "in" : "query",
          "description" : "The physical rendering layout format structure",
          "schema" : {
            "type" : "string",
            "enum" : [ "PDF", "HTML", "MARKDOWN" ],
            "default" : "PDF"
          }
        }, {
          "name" : "logo",
          "in" : "query",
          "description" : "The UUID of the logo used in the report",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "styleProfile",
          "in" : "query",
          "description" : "The presentation design profile mapping to a predefined stylesheet (.css) file",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "OTHER" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "202" : {
            "description" : "A tracking job was created. Poll Location for its status; acceptance does not guarantee successful generation.",
            "headers" : {
              "Location" : {
                "description" : "Absolute URL for polling this report job.",
                "style" : "simple",
                "schema" : {
                  "type" : "string",
                  "format" : "uri"
                }
              },
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ReportJobAccepted"
                },
                "example" : {
                  "jobUuid" : "603055e8-4734-461e-bf42-d4456afe7bb7"
                }
              }
            }
          },
          "401" : {
            "description" : "Unauthorized access credentials."
          },
          "403" : {
            "description" : "Access denied. The resource returns an unquoted text message labeled application/json; read it as text rather than assuming a JSON object.",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/report/{ReportJobId}" : {
      "get" : {
        "tags" : [ "Reports" ],
        "summary" : "Poll report generation status",
        "description" : "Poll the URL returned in the start operation's Location header. Status is PENDING, PROCESSING, SUCCESS or FAILED. A completed file may subsequently be unavailable.",
        "operationId" : "getReportGenerationStatus",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The unique tracking identifier for the repository",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The unique tracking identifier for the model",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "ReportJobId",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Current job status.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ReportJobStatus"
                },
                "example" : {
                  "status" : "PROCESSING"
                }
              }
            }
          },
          "403" : {
            "description" : "Access denied. The resource returns an unquoted text message labeled application/json; read it as text rather than assuming a JSON object.",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "string",
                  "format" : "binary"
                }
              }
            }
          },
          "404" : {
            "description" : "No report job was found. No response body."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories" : {
      "get" : {
        "tags" : [ "Repositories" ],
        "summary" : "List repositories",
        "description" : "Retrieve all repositories.",
        "operationId" : "getRepositories",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `colorScheme`, `colorScheme.colorScheme`, `created`, `directory`, `directory.directory`, `draft`, `lastModified`, `locked`, `name`, `owner`, `owner.owner`, `permissions`, `status`, `template`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "colorScheme", "colorScheme.colorScheme", "created", "directory", "directory.directory", "draft", "lastModified", "locked", "name", "owner", "owner.owner", "permissions", "status", "template", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `colorScheme.colorScheme`, `created`, `directory.directory`, `draft`, `lastModified`, `locked`, `name`, `owner.owner`, `permissions`, `status`, `template`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "colorScheme.colorScheme", "created", "directory.directory", "draft", "lastModified", "locked", "name", "owner.owner", "permissions", "status", "template", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `colorScheme`, `colorScheme.colorScheme`, `directory`, `directory.directory`, `name`, `owner`, `owner.owner`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `colorScheme`, `colorScheme.colorScheme`, `directory`, `directory.directory`, `name`, `owner`, `owner.owner`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "colorScheme", "colorScheme.colorScheme", "directory", "directory.directory", "name", "owner", "owner.owner", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RepositoryPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "603055e8-4734-461e-bf42-d4456afe7bb7",
                    "name" : "MTB_301",
                    "status" : "ONLINE",
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "directory" : null,
                    "colorScheme" : null,
                    "locked" : false,
                    "template" : false,
                    "permissions" : false,
                    "draft" : false,
                    "created" : "2026-02-11T07:45:20Z",
                    "lastModified" : "2026-02-20T10:14:07Z"
                  }, {
                    "uuid" : "9d4ac3a7-f224-4a21-9b1f-9e84da2bc6ea",
                    "name" : "MTB_301_2",
                    "status" : "ONLINE",
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "directory" : null,
                    "colorScheme" : null,
                    "locked" : false,
                    "template" : false,
                    "permissions" : false,
                    "draft" : false,
                    "created" : "2026-02-16T04:06:27Z",
                    "lastModified" : "2026-02-16T04:06:30Z"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Repositories" ],
        "summary" : "Create a repository",
        "description" : "Create a repository.",
        "operationId" : "createRepository",
        "requestBody" : {
          "description" : "MtbRepositoryDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbRepositoryDto"
              },
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "name" : "Repository 1",
                    "template" : false,
                    "languages" : [ {
                      "name" : "English",
                      "locale" : "en_GB",
                      "default" : true
                    } ]
                  }
                },
                "With additional optional fields" : {
                  "description" : "With additional optional fields",
                  "value" : {
                    "name" : "Repository 2",
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "directory" : "92742b5b-7603-4661-bf08-1b73396203ce",
                    "colorScheme" : "0260e58f-0dae-4126-b3ee-11a1228231c0",
                    "template" : false,
                    "languages" : [ {
                      "name" : "English",
                      "locale" : "en_GB",
                      "default" : true
                    }, {
                      "name" : "Swedish",
                      "locale" : "sv_SE",
                      "default" : false
                    } ]
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbRepositoryDto"
                },
                "example" : {
                  "uuid" : "d7effeb5-46b1-43a4-bcd7-b79846a943ff",
                  "name" : "New repository 2",
                  "owner" : "anonymous",
                  "directory" : "92742b5b-7603-4661-bf08-1b73396203ce",
                  "colorScheme" : "0260e58f-0dae-4126-b3ee-11a1228231c0",
                  "template" : false,
                  "templateRepository" : "a662e60b-6818-4a0a-a291-4c307e47c5e8"
                }
              }
            }
          },
          "202" : {
            "description" : "Accepted. Request has been accepted for processing",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbRepositoryDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}" : {
      "get" : {
        "tags" : [ "Repositories" ],
        "summary" : "Get a repository",
        "description" : "Retrieve a specific repository.",
        "operationId" : "getRepository",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "2d95b328-703a-4a78-a23c-faffb9c342a1"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `colorScheme`, `colorScheme.colorScheme`, `created`, `directory`, `directory.directory`, `draft`, `lastModified`, `locked`, `name`, `owner`, `owner.owner`, `permissions`, `status`, `template`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "colorScheme", "colorScheme.colorScheme", "created", "directory", "directory.directory", "draft", "lastModified", "locked", "name", "owner", "owner.owner", "permissions", "status", "template", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RepositoryView"
                },
                "example" : {
                  "uuid" : "603055e8-4734-461e-bf42-d4456afe7bb7",
                  "name" : "MTB_301",
                  "status" : "ONLINE",
                  "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "directory" : null,
                  "colorScheme" : null,
                  "locked" : false,
                  "template" : false,
                  "permissions" : false,
                  "draft" : false,
                  "created" : "2026-02-11T07:45:20Z",
                  "lastModified" : "2026-02-20T10:14:07Z"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Repositories" ],
        "summary" : "Delete a repository",
        "description" : "Delete the repository with the provided uuid.",
        "operationId" : "deleteRepository",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c8114124-03ff-476a-a2dd-220431be4097"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Repositories" ],
        "summary" : "Partially update a repository",
        "description" : "Update part of a repository.",
        "operationId" : "updateRepository",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9a-fA-F\\-]{36}",
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c8114124-03ff-476a-a2dd-220431be4097"
        } ],
        "requestBody" : {
          "description" : "MtbRepositoryDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbRepositoryDto"
              },
              "examples" : {
                "Update repository name" : {
                  "description" : "Update repository name",
                  "value" : {
                    "name" : "New repository name"
                  }
                },
                "Update repository owner" : {
                  "description" : "Update repository owner",
                  "value" : {
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52"
                  }
                },
                "Update repository template field" : {
                  "description" : "Update repository template field",
                  "value" : {
                    "template" : true
                  }
                },
                "Update repository color scheme" : {
                  "description" : "Update repository color scheme",
                  "value" : {
                    "colorScheme" : "0260e58f-0dae-4126-b3ee-11a1228231c0"
                  }
                },
                "Update repository directory" : {
                  "description" : "Update repository directory",
                  "value" : {
                    "directory" : "ca3aa5b1-d094-4cf6-84ab-e446091be3ff"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A success message.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/configuration" : {
      "get" : {
        "tags" : [ "Repository configuration" ],
        "summary" : "Get repository configuration",
        "operationId" : "getRepositoryConfiguration",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RepositoryConfiguration"
                },
                "example" : {
                  "name" : "standard-4.5",
                  "version" : "12",
                  "uuid" : "7ad6bdb1-9a16-400c-8c32-02d99be33508",
                  "language" : "on",
                  "revisions" : "on",
                  "swimlanes" : {
                    "editable" : true,
                    "swimlane" : [ {
                      "swimlaneRelation" : [ {
                        "objectType" : "PROCESS",
                        "relationType" : "raciaccountable"
                      }, {
                        "objectType" : "ACTIVITY",
                        "relationType" : "raciaccountable"
                      } ],
                      "objectType" : "ORGANISATION"
                    }, {
                      "swimlaneRelation" : [ {
                        "objectType" : "PROCESS",
                        "relationType" : "raciaccountable"
                      }, {
                        "objectType" : "ACTIVITY",
                        "relationType" : "raciaccountable"
                      } ],
                      "objectType" : "POSITION"
                    } ]
                  },
                  "layers" : "on",
                  "lists" : "on",
                  "quickdraw" : {
                    "enabled" : true,
                    "override" : [ {
                      "attachment" : [ {
                        "sourceType" : "TOOL",
                        "left" : {
                          "button" : [ {
                            "edgeType" : "isakindof",
                            "outputType" : "TOOL",
                            "reverse" : false
                          } ]
                        },
                        "right" : {
                          "button" : [ {
                            "edgeType" : "consistsof",
                            "outputType" : "TOOL",
                            "reverse" : false
                          } ]
                        }
                      } ],
                      "modelType" : "PRODUCT_MODEL"
                    } ]
                  },
                  "breakdownsymbols" : "on",
                  "copybreakdownattributes" : "off"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings/{settingId}" : {
      "get" : {
        "tags" : [ "Settings" ],
        "summary" : "Get a setting",
        "description" : "Retrieve a specific setting.",
        "operationId" : "getSetting",
        "parameters" : [ {
          "name" : "settingId",
          "in" : "path",
          "description" : "The UUID of the setting.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "4dfe0d52-9ee3-4565-bac8-f2b4f928519d"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `uuid`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "uuid", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SettingView"
                },
                "example" : {
                  "key" : "setting1",
                  "value" : "value1",
                  "uuid" : "4dfe0d52-9ee3-4565-bac8-f2b4f928519d"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/settings" : {
      "get" : {
        "tags" : [ "Settings" ],
        "summary" : "List settings",
        "description" : "Retrieve all settings.",
        "operationId" : "getSettings",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `uuid`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "uuid", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `key`, `uuid`, `value`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "uuid", "value" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `uuid`, `value`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `uuid`, `value`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "uuid", "value" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SettingPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 25,
                  "total" : 2,
                  "data" : [ {
                    "uuid" : "4dfe0d52-9ee3-4565-bac8-f2b4f928519d",
                    "key" : "setting1",
                    "value" : "value1"
                  }, {
                    "uuid" : "123e4567-e89b-12d3-a456-426614174000",
                    "key" : "setting2",
                    "value" : "value2"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/subscribers/{groupSubscriberId}/members" : {
      "get" : {
        "tags" : [ "Subscribers" ],
        "summary" : "Get members of a group subscriber",
        "description" : "Retrieve a paginated list of members belonging to the specified group subscriber.",
        "operationId" : "getGroupSubscriberMembers",
        "parameters" : [ {
          "name" : "groupSubscriberId",
          "in" : "path",
          "description" : "The UUID of the group subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbSubscriberDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "55721d4e-9916-4d16-8503-91bd157ec4cc",
                    "email" : "john.doe@email.com",
                    "firstName" : "John",
                    "lastName" : "Doe",
                    "type" : "EMAIL"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Subscribers" ],
        "summary" : "Add a member to a group subscriber",
        "description" : "Add a new member to the specified group subscriber.",
        "operationId" : "addGroupSubscriberMember",
        "parameters" : [ {
          "name" : "groupSubscriberId",
          "in" : "path",
          "description" : "The UUID of the group subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "MtbSubscriberDto with the uuid of the member to be added",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbSubscriberDto"
              },
              "examples" : {
                "Add user subscriber" : {
                  "description" : "Add user subscriber",
                  "value" : {
                    "uuid" : "59562321-c4f0-4ba5-bdfd-02562a76d16a"
                  }
                },
                "Add email subscriber" : {
                  "description" : "Add email subscriber",
                  "value" : {
                    "uuid" : "55721d4e-9916-4d16-8503-91bd157ec4cc"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbGroupSubscriberMemberDto"
                },
                "example" : {
                  "uuid" : "55721d4e-9916-4d16-8503-91bd157ec4cc",
                  "emailSubscriber" : {
                    "uuid" : "59562321-c4f0-4ba5-bdfd-02562a76d16a",
                    "email" : "john.doe@email.com",
                    "firstName" : "John",
                    "lastName" : "Doe",
                    "type" : "EMAIL"
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/subscribers" : {
      "get" : {
        "tags" : [ "Subscribers" ],
        "summary" : "List subscribers",
        "description" : "Retrieve a list of subscribers.",
        "operationId" : "getSubscribers",
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbSubscriberDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 3,
                  "data" : [ {
                    "uuid" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "type" : "USER"
                  }, {
                    "uuid" : "f85d86ac-1503-4556-a2e7-39e1449ac7e8",
                    "email" : "john@email.com",
                    "firstName" : "John",
                    "lastName" : "Doe",
                    "type" : "EMAIL"
                  }, {
                    "uuid" : "59562321-c4f0-4ba5-bdfd-02562a76d16a",
                    "email" : "jane.doe@email.com",
                    "firstName" : "Jane",
                    "lastName" : "Doe",
                    "type" : "EMAIL"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Subscribers" ],
        "summary" : "Create a subscriber",
        "description" : "Create a subscriber with the provided values",
        "operationId" : "postSubscriber",
        "requestBody" : {
          "description" : "MtbSubscriberDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbSubscriberDto"
              },
              "examples" : {
                "Create email subscriber" : {
                  "description" : "Create email subscriber",
                  "value" : {
                    "type" : "EMAIL",
                    "email" : "john.doe@email.com",
                    "firstName" : "John",
                    "lastName" : "Doe"
                  }
                },
                "Create group subscriber" : {
                  "description" : "Create group subscriber",
                  "value" : {
                    "name" : "group 1",
                    "lastName" : "John",
                    "firstName" : "Peterson",
                    "email" : "johna@12c8.com",
                    "type" : "GROUP"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbSubscriberDto"
                },
                "example" : {
                  "uuid" : "66e3cdde-829a-4bb0-9bff-db19f0c57366",
                  "email" : "johnd@12c8.com",
                  "firstName" : "Doe",
                  "lastName" : "John",
                  "type" : "EMAIL"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/subscribers/{subscriberId}" : {
      "delete" : {
        "tags" : [ "Subscribers" ],
        "summary" : "Delete a subscriber",
        "description" : "Delete the subscriber with the provided uuid",
        "operationId" : "deleteSubscriber",
        "parameters" : [ {
          "name" : "subscriberId",
          "in" : "path",
          "description" : "The UUID of the subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e76e9aec-4f22-442a-a0eb-f24985e0c231"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Subscribers" ],
        "summary" : "Update a subscriber",
        "description" : "Update a subscriber",
        "operationId" : "patchSubscriber",
        "parameters" : [ {
          "name" : "subscriberId",
          "in" : "path",
          "description" : "The UUID of the subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e76e9aec-4f22-442a-a0eb-f24985e0c231"
        } ],
        "requestBody" : {
          "description" : "MtbSubscriberDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbSubscriberDto"
              },
              "examples" : {
                "Update email subscriber" : {
                  "description" : "Update email subscriber",
                  "value" : {
                    "lastName" : "John",
                    "firstName" : "Peterson",
                    "email" : "johna@12c8.com"
                  }
                },
                "Update group subscriber" : {
                  "description" : "Update group subscriber",
                  "value" : {
                    "name" : "New Group"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/subscribers/{groupSubscriberId}/members/{memberSubscriberId}" : {
      "get" : {
        "tags" : [ "Subscribers" ],
        "summary" : "Get a member of a group subscriber",
        "description" : "Retrieve the details of a specific member belonging to the specified group subscriber.",
        "operationId" : "getGroupSubscriberMember",
        "parameters" : [ {
          "name" : "groupSubscriberId",
          "in" : "path",
          "description" : "The UUID of the group subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "memberSubscriberId",
          "in" : "path",
          "description" : "The UUID of the member subscriber.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "responses" : {
          "200" : {
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbSubscriberDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details.",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiErrorDto"
                },
                "example" : {
                  "message" : "Invalid request",
                  "timestamp" : "2026-09-11T10:00:00Z"
                }
              }
            }
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/plugin-data" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "List symbol plugin data",
        "description" : "Retrieve all symbol plugin data list for a repository",
        "operationId" : "getSymbolPluginDataList",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.position`, `relations.relationType`, `relations.strong`, `root`, `textContent`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "key", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.position", "relations.relationType", "relations.strong", "root", "textContent", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `content`, `key`, `plugin`, `root`, `textContent`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "key", "plugin", "root", "textContent", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.relationType`, `textContent`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.relationType`, `textContent`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.relationType", "textContent", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AttachedPluginDataPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "3b3b576f-986f-43d8-af19-ea76efa57eb9",
                    "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                    "key" : "mt.docs",
                    "root" : true,
                    "relations" : [ { } ],
                    "content" : "SGVsbG8gd29ybGQh",
                    "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Create plugin data for a symbol",
        "description" : "Create a specific plugin data for a symbol in a repository",
        "operationId" : "createSymbolPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "674820b3-3317-4786-86f4-f8a8ea660a1a"
        } ],
        "requestBody" : {
          "description" : "Plugin data",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginDataDto"
              },
              "example" : {
                "plugin" : "b99b8cc4-cedb-486d-96b3-98ad34fc0408",
                "key" : "query",
                "root" : true,
                "content" : "binary data",
                "textContent" : "TEXT"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginDataDto"
                },
                "example" : {
                  "uuid" : "3b3b576f-986f-43d8-af19-ea76efa57eb9",
                  "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                  "key" : "mt.docs",
                  "content" : "SGVsbG8gd29ybGQh",
                  "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>",
                  "root" : true
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/plugin-data/{pluginDataId}" : {
      "get" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Get plugin data",
        "description" : "Retrieve a specific plugin data for a repository",
        "operationId" : "getSymbolPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `key`, `plugin`, `relations`, `relations.childEntity`, `relations.childEntity.plugin`, `relations.position`, `relations.relationType`, `relations.strong`, `root`, `textContent`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "key", "plugin", "relations", "relations.childEntity", "relations.childEntity.plugin", "relations.position", "relations.relationType", "relations.strong", "root", "textContent", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AttachedPluginDataView"
                },
                "example" : {
                  "uuid" : "3b3b576f-986f-43d8-af19-ea76efa57eb9",
                  "plugin" : "c46db74c-0604-43fe-8a4b-07e567bcd175",
                  "key" : "mt.docs",
                  "root" : true,
                  "relations" : [ { } ],
                  "content" : "SGVsbG8gd29ybGQh",
                  "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Delete plugin data for a symbol",
        "description" : "Delete a specific plugin data for a symbol in a repository",
        "operationId" : "deleteSymbolPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "674820b3-3317-4786-86f4-f8a8ea660a1a"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Plugin data" ],
        "summary" : "Update plugin data for a symbol",
        "description" : "Update a specific plugin data for a symbol in a repository",
        "operationId" : "updateSymbolPluginData",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "674820b3-3317-4786-86f4-f8a8ea660a1a"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "requestBody" : {
          "description" : "Plugin data",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginDataDto"
              },
              "examples" : {
                "Update content only" : {
                  "description" : "Update content only",
                  "value" : {
                    "content" : "SGVsbG8gd29ybGQh"
                  }
                },
                "Update textContent only" : {
                  "description" : "Update textContent only",
                  "value" : {
                    "textContent" : "<?xml version=\"1.0\" ?><entity><annotated><field-value name=\"yQueryGrouping\"></field-value><field-value name=\"xList\" value=\"38d32154-011d-4216-bdbf-54d2ba5f2171\"></field-value><field-value name=\"yList\" value=\"beddff7f-2e39-4858-99d1-3829ed0b25fb\"></field-value><field-value name=\"hideEmpty\" value=\"true\"></field-value><field-value name=\"uuid\" value=\"89dd34f3-85ba-4870-a0ea-349682b74094\"></field-value><field-value name=\"xQueryGrouping\" value=\"MODEL\"></field-value></annotated><custom><titles><title value=\"Responsibility matrix\" language=\"b030a9f8-a89c-41c4-a972-0da5763c4d95\"></title></titles><relations><relation type=\"RELATIONS\" icon-en_GB=\"A\" icon=\"A\" default-icon=\"false\" edgeType=\"RACI_ACCOUNTABLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"R\" icon=\"R\" default-icon=\"false\" edgeType=\"RACI_RESPONSIBLE\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"C\" icon=\"C\" default-icon=\"false\" edgeType=\"RACI_CONSULTANT\"></relation><relation type=\"RELATIONS\" icon-en_GB=\"I\" icon=\"I\" default-icon=\"false\" edgeType=\"RACI_INFORMED\"></relation></relations><xColors><color>#FABB00</color><color>#C9D34C</color><color>#FFDD00</color><color>rgb(220, 50, 0)</color><color>rgb(112, 103, 135)</color></xColors><yColors></yColors></custom></entity>"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/plugin-data/{pluginDataId}/relations" : {
      "get" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "List plugin relations",
        "description" : "Retrieve a paginated list of plugin relations for a repository for a symbol",
        "operationId" : "getSymbolPluginRelations",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "e446970d-d5e5-40cf-b328-ffff3feb6be5",
                    "target" : "4691ac77-96d8-454c-a80e-c63f733e6cf1",
                    "relationType" : "custom-relation",
                    "position" : 1,
                    "strong" : true
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Create plugin relation for a symbol",
        "description" : "Create a specific plugin relation for a symbol in a repository",
        "operationId" : "createSymbolPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "674820b3-3317-4786-86f4-f8a8ea660a1a"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        } ],
        "requestBody" : {
          "description" : "MtbPluginRelationDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginRelationDto"
              },
              "example" : {
                "relationType" : "relation type",
                "target" : "60816c18-d629-4f5b-8b52-e43aca2594b5",
                "strong" : true,
                "position" : 1
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDto"
                },
                "example" : {
                  "uuid" : "e446970d-d5e5-40cf-b328-ffff3feb6be5",
                  "target" : "4691ac77-96d8-454c-a80e-c63f733e6cf1",
                  "relationType" : "Custom relation ",
                  "position" : 1,
                  "strong" : true
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/plugin-data/{pluginDataId}/relations/{pluginRelationId}" : {
      "get" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Get a plugin relation",
        "description" : "Retrieve a specific plugin relation for a symbol in a repository",
        "operationId" : "getSymbolPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fc9777a5-6b09-494b-a113-ebbea6a72d9a"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPluginRelationDto"
                },
                "example" : {
                  "uuid" : "e446970d-d5e5-40cf-b328-ffff3feb6be5",
                  "target" : "4691ac77-96d8-454c-a80e-c63f733e6cf1",
                  "relationType" : "Custom relation ",
                  "position" : 1,
                  "strong" : true
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Delete plugin relation for a symbol",
        "description" : "Delete a specific plugin relation for a symbol in a repository",
        "operationId" : "deleteSymbolPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "674820b3-3317-4786-86f4-f8a8ea660a1a"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fc9777a5-6b09-494b-a113-ebbea6a72d9a"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Plugin relations" ],
        "summary" : "Update plugin relation for a symbol",
        "description" : "Update a specific plugin relation for a symbol in a repository",
        "operationId" : "updateSymbolPluginRelation",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "674820b3-3317-4786-86f4-f8a8ea660a1a"
        }, {
          "name" : "pluginDataId",
          "in" : "path",
          "description" : "The UUID of the plugin data.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "9edfd181-1ff4-4d05-871f-7bc3cbda5e34"
        }, {
          "name" : "pluginRelationId",
          "in" : "path",
          "description" : "The UUID of the plugin relation.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "fc9777a5-6b09-494b-a113-ebbea6a72d9a"
        } ],
        "requestBody" : {
          "description" : "MtbPluginRelationDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPluginRelationDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "position" : 1
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/properties/{providerId}/{key}" : {
      "get" : {
        "tags" : [ "Symbols" ],
        "summary" : "Get a symbol property",
        "description" : "Retrieve a specific symbol property for a symbol within a repository.",
        "operationId" : "getProperty",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "3e47e390-7b90-11df-8c4a-0800200c9a66"
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "mt-server"
        }, {
          "name" : "key",
          "in" : "path",
          "description" : "The property key.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "string"
          },
          "example" : "property name"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyView"
                },
                "example" : {
                  "key" : "test-symbol-prop-1",
                  "value" : "test-val"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/properties/{providerId}" : {
      "get" : {
        "tags" : [ "Symbols" ],
        "summary" : "List symbol properties",
        "description" : "Retrieve all symbol properties for a symbol within a repository.",
        "operationId" : "getSymbolProperties",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "3e47e390-7b90-11df-8c4a-0800200c9a66"
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "mt-server"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `key`, `value`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `value`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `value`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "key" : "test-symbol-prop-1",
                    "value" : "test-val-1"
                  }, {
                    "key" : "test-symbol-prop-2",
                    "value" : "test-val-2"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/versions/{versionNumber}" : {
      "get" : {
        "tags" : [ "Symbols" ],
        "summary" : "Get a symbol version",
        "description" : "Retrieve a version for a symbol",
        "operationId" : "getSymbolVersion",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        }, {
          "name" : "versionNumber",
          "in" : "path",
          "description" : "The symbol version number.",
          "required" : true,
          "schema" : {
            "type" : "integer",
            "format" : "int64"
          },
          "example" : 1
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `message`, `newVersion`, `reason`, `symbol`, `symbol.version`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.model.version`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `trigger.symbol.version`, `user`, `user.user`, `workflowState`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "newVersion", "reason", "symbol", "symbol.version", "trigger", "trigger.model", "trigger.model.type", "trigger.model.uuid", "trigger.model.version", "trigger.symbol", "trigger.symbol.type", "trigger.symbol.uuid", "trigger.symbol.version", "user", "user.user", "workflowState" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/VersionView"
                },
                "example" : {
                  "logItems" : [ {
                    "message" : "Model with id 2 removed from workspace with id 2",
                    "reason" : "CHANGES_IN_REVISION",
                    "workflowState" : null,
                    "newVersion" : false,
                    "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "version" : 0
                  } ],
                  "version" : 0
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/versions" : {
      "get" : {
        "tags" : [ "Symbols" ],
        "summary" : "List symbol versions",
        "description" : "Retrieve all versions for a symbol",
        "operationId" : "getSymbolVersions",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "80c41767-0247-4f60-9d58-c5e925ff8585"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `message`, `newVersion`, `reason`, `symbol`, `symbol.version`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.model.version`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `trigger.symbol.version`, `user`, `user.user`, `workflowState`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "newVersion", "reason", "symbol", "symbol.version", "trigger", "trigger.model", "trigger.model.type", "trigger.model.uuid", "trigger.model.version", "trigger.symbol", "trigger.symbol.type", "trigger.symbol.uuid", "trigger.symbol.version", "user", "user.user", "workflowState" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `message`, `newVersion`, `reason`, `symbol.version`, `trigger.model.type`, `trigger.model.uuid`, `trigger.model.version`, `trigger.symbol.type`, `trigger.symbol.uuid`, `trigger.symbol.version`, `user.user`, `workflowState`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "newVersion", "reason", "symbol.version", "trigger.model.type", "trigger.model.uuid", "trigger.model.version", "trigger.symbol.type", "trigger.symbol.uuid", "trigger.symbol.version", "user.user", "workflowState" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `message`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `user`, `user.user`, `workflowState`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `message`, `trigger`, `trigger.model`, `trigger.model.type`, `trigger.model.uuid`, `trigger.symbol`, `trigger.symbol.type`, `trigger.symbol.uuid`, `user`, `user.user`, `workflowState`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "message", "trigger", "trigger.model", "trigger.model.type", "trigger.model.uuid", "trigger.symbol", "trigger.symbol.type", "trigger.symbol.uuid", "user", "user.user", "workflowState" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/VersionPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "logItems" : [ {
                      "message" : "Model with id 2 removed from workspace with id 2",
                      "reason" : "CHANGES_IN_REVISION",
                      "workflowState" : null,
                      "newVersion" : false,
                      "user" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                      "version" : 0
                    } ],
                    "version" : 0
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/descriptions/{descriptionTypeId}" : {
      "get" : {
        "tags" : [ "Descriptions" ],
        "summary" : "Get a description",
        "description" : "Retrieve a specific description for a symbol",
        "operationId" : "getSymbolDescription",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated fields: `descriptionType`, `content`. Names are case-sensitive. Omit to include both fields. This endpoint does not support projections.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5b7fb1aa-a133-49dc-afd2-49117bec8e8b"
        }, {
          "name" : "descriptionTypeId",
          "in" : "path",
          "description" : "The UUID of the field (called a description type in the API).",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "a47a3dc6-ac54-4025-8d6d-6a4491c369dc"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDescriptionDto"
                },
                "example" : {
                  "descriptionType" : "4f394d93-0d4a-4b0c-b512-d96f193b9a5a",
                  "content" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "text" : "<p>Description text.</p>"
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Descriptions" ],
        "summary" : "Create or update a symbol description",
        "description" : "Saves a symbol description after checking repository and symbol access. A successful write updates the last-modified time of both the symbol and repository.",
        "operationId" : "updateSymbolDescription",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5b7fb1aa-a133-49dc-afd2-49117bec8e8b"
        }, {
          "name" : "descriptionTypeId",
          "in" : "path",
          "description" : "The UUID of the field (called a description type in the API).",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c3ba7295-7ae6-4771-994c-f6769b2377a1"
        } ],
        "requestBody" : {
          "description" : "Description content to save",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDescriptionDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "content" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "text" : "New text",
                        "translated" : false
                      }
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "409" : {
            "description" : "There is a resource conflict. A resource may be locked or already exist."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}/descriptions" : {
      "get" : {
        "tags" : [ "Descriptions" ],
        "summary" : "List descriptions",
        "description" : "Retrieve all descriptions for a repository",
        "operationId" : "getSymbolDescriptions",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated fields: `descriptionType`, `content`. Names are case-sensitive. Omit to include both fields. This endpoint does not support projections.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "899be98d-ecd9-4733-b8a5-fea85961cbf6"
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbDescriptionDtoPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "descriptionType" : "4f394d93-0d4a-4b0c-b512-d96f193b9a5a",
                    "content" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "text" : "<p>Description text.</p>"
                      }
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols" : {
      "get" : {
        "tags" : [ "Symbols" ],
        "summary" : "List symbols",
        "description" : "Retrieve all symbols for a repository",
        "operationId" : "getSymbols",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `_group`, `_group.group`, `allRead`, `allWrite`, `alternativeSymbol`, `breakdowns`, `breakdowns.modelEntity`, `breakdowns.modelEntity.uuid`, `created`, `createdBy`, `createdBy.createdBy`, `documents`, `documents.id`, `documents.source`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy`, `lastModifiedBy.lastModifiedBy`, `locked`, `lockedBy`, `objectType`, `owner`, `owner.owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `referenceId`, `titles`, `titles.languageEntity`, `titles.languageEntity.defaultLanguage`, `titles.languageEntity.uuid`, `titles.rawTitle`, `titles.title`, `titles.translated`, `uuid`, `version`, `versionLocked`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "_group", "_group.group", "allRead", "allWrite", "alternativeSymbol", "breakdowns", "breakdowns.modelEntity", "breakdowns.modelEntity.uuid", "created", "createdBy", "createdBy.createdBy", "documents", "documents.id", "documents.source", "groupRead", "groupWrite", "historyEdited", "historyPath", "lastModified", "lastModifiedBy", "lastModifiedBy.lastModifiedBy", "locked", "lockedBy", "objectType", "owner", "owner.owner", "ownerRead", "ownerWrite", "parentVersion", "prefix", "prefixLocked", "referenceId", "titles", "titles.languageEntity", "titles.languageEntity.defaultLanguage", "titles.languageEntity.uuid", "titles.rawTitle", "titles.title", "titles.translated", "uuid", "version", "versionLocked" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `_group.group`, `allRead`, `allWrite`, `alternativeSymbol`, `created`, `createdBy.createdBy`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy.lastModifiedBy`, `locked`, `lockedBy`, `objectType`, `owner.owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `referenceId`, `uuid`, `version`, `versionLocked`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "_group.group", "allRead", "allWrite", "alternativeSymbol", "created", "createdBy.createdBy", "groupRead", "groupWrite", "historyEdited", "historyPath", "lastModified", "lastModifiedBy.lastModifiedBy", "locked", "lockedBy", "objectType", "owner.owner", "ownerRead", "ownerWrite", "parentVersion", "prefix", "prefixLocked", "referenceId", "uuid", "version", "versionLocked", "titles.title" ],
          "x-2c8-localized-sort-values" : [ "titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `_group`, `_group.group`, `alternativeSymbol`, `breakdowns`, `breakdowns.modelEntity`, `breakdowns.modelEntity.uuid`, `createdBy`, `createdBy.createdBy`, `documents`, `documents.id`, `documents.source`, `historyPath`, `lastModifiedBy`, `lastModifiedBy.lastModifiedBy`, `lockedBy`, `objectType`, `owner`, `owner.owner`, `prefix`, `referenceId`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.rawTitle`, `titles.title`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `_group`, `_group.group`, `alternativeSymbol`, `breakdowns`, `breakdowns.modelEntity`, `breakdowns.modelEntity.uuid`, `createdBy`, `createdBy.createdBy`, `documents`, `documents.id`, `documents.source`, `historyPath`, `lastModifiedBy`, `lastModifiedBy.lastModifiedBy`, `lockedBy`, `objectType`, `owner`, `owner.owner`, `prefix`, `referenceId`, `titles`, `titles.languageEntity`, `titles.languageEntity.uuid`, `titles.rawTitle`, `titles.title`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "_group", "_group.group", "alternativeSymbol", "breakdowns", "breakdowns.modelEntity", "breakdowns.modelEntity.uuid", "createdBy", "createdBy.createdBy", "documents", "documents.id", "documents.source", "historyPath", "lastModifiedBy", "lastModifiedBy.lastModifiedBy", "lockedBy", "objectType", "owner", "owner.owner", "prefix", "referenceId", "titles", "titles.languageEntity", "titles.languageEntity.uuid", "titles.rawTitle", "titles.title", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SymbolPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 15,
                  "data" : [ {
                    "uuid" : "69439d4c-9997-4eae-9209-fb8c83f258d5",
                    "alternativeSymbol" : "OR",
                    "parentVersion" : null,
                    "version" : 0,
                    "prefix" : null,
                    "prefixLocked" : false,
                    "referenceId" : null,
                    "historyEdited" : true,
                    "objectType" : "DECISION",
                    "lockedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "documents" : [ {
                      "id" : "7d8f85e4-88b3-4818-82f0-92b3c51a59c1",
                      "source" : "mt.documents"
                    } ],
                    "ownerRead" : true,
                    "ownerWrite" : true,
                    "groupRead" : true,
                    "groupWrite" : true,
                    "allRead" : true,
                    "allWrite" : false,
                    "locked" : null,
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "historyPath" : null,
                    "created" : "2026-02-11T09:03:20Z",
                    "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                    "lastModifiedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "versionLocked" : false,
                    "lastModified" : "2026-02-11T09:03:20Z",
                    "createdBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : ""
                      }
                    }
                  }, {
                    "uuid" : "3d3bf44f-4a21-44f8-a071-71dd1862df7c",
                    "alternativeSymbol" : "BUSINESS_OBJECT",
                    "parentVersion" : null,
                    "version" : 0,
                    "prefix" : null,
                    "prefixLocked" : false,
                    "referenceId" : null,
                    "historyEdited" : true,
                    "objectType" : "BUSINESS_OBJECT",
                    "lockedBy" : null,
                    "documents" : [ ],
                    "ownerRead" : true,
                    "ownerWrite" : true,
                    "groupRead" : true,
                    "groupWrite" : true,
                    "allRead" : true,
                    "allWrite" : false,
                    "locked" : null,
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "historyPath" : null,
                    "created" : "2026-02-18T09:06:06Z",
                    "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                    "lastModifiedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "versionLocked" : false,
                    "lastModified" : "2026-02-18T09:24:22Z",
                    "createdBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "er"
                      }
                    }
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Symbols" ],
        "summary" : "Create a symbol",
        "description" : "Create a symbol. The `group` field uses a customer-group UUID as permission-group selector. If `group` is omitted, the request-scoped `2c8-Permission-Group` header is used when present, otherwise the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` is applied.",
        "operationId" : "createSymbol",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "MtbSymbolDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbSymbolDto"
              },
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "objectType" : "process",
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "group" : "b710b349-673b-4608-9abb-27afd634dbab",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Title 1"
                      },
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                        "title" : "Title 2"
                      }
                    }
                  }
                },
                "With optional fields" : {
                  "description" : "With optional fields",
                  "value" : {
                    "objectType" : "process",
                    "alternativeSymbol" : "PROCESS",
                    "prefix" : null,
                    "prefixLocked" : false,
                    "referenceId" : null,
                    "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "group" : "b710b349-673b-4608-9abb-27afd634dbab",
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Title 1",
                        "rawTitle" : null,
                        "translated" : true
                      },
                      "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                        "title" : "Title 2",
                        "rawTitle" : null,
                        "translated" : true
                      }
                    },
                    "documents" : [ ]
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbSymbolDto"
                },
                "example" : {
                  "uuid" : "5a8f2723-4894-4b23-8dee-120ff13d2a28",
                  "alternativeSymbol" : "PROCESS",
                  "prefix" : null,
                  "prefixLocked" : false,
                  "objectType" : "PROCESS",
                  "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "group" : "b710b349-673b-4608-9abb-27afd634dbab",
                  "ownerRead" : true,
                  "ownerWrite" : true,
                  "groupRead" : true,
                  "groupWrite" : true,
                  "allRead" : true,
                  "allWrite" : false,
                  "titles" : {
                    "e72c836f-5658-4c9f-a20a-e97ef0c2ef97" : {
                      "title" : "Title 2",
                      "translated" : true,
                      "rawTitle" : null
                    },
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : "Title 1",
                      "translated" : true,
                      "rawTitle" : null
                    }
                  },
                  "documents" : [ ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/symbols/{symbolId}" : {
      "get" : {
        "tags" : [ "Symbols" ],
        "summary" : "Get a symbol",
        "description" : "Retrieve a specific symbol for a repository",
        "operationId" : "getSymbol",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "7c329613-e2ca-4739-b09b-803e56397440"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `_group`, `_group.group`, `allRead`, `allWrite`, `alternativeSymbol`, `breakdowns`, `breakdowns.modelEntity`, `breakdowns.modelEntity.uuid`, `created`, `createdBy`, `createdBy.createdBy`, `documents`, `documents.id`, `documents.source`, `groupRead`, `groupWrite`, `historyEdited`, `historyPath`, `lastModified`, `lastModifiedBy`, `lastModifiedBy.lastModifiedBy`, `locked`, `lockedBy`, `objectType`, `owner`, `owner.owner`, `ownerRead`, `ownerWrite`, `parentVersion`, `prefix`, `prefixLocked`, `referenceId`, `titles`, `titles.languageEntity`, `titles.languageEntity.defaultLanguage`, `titles.languageEntity.uuid`, `titles.rawTitle`, `titles.title`, `titles.translated`, `uuid`, `version`, `versionLocked`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "_group", "_group.group", "allRead", "allWrite", "alternativeSymbol", "breakdowns", "breakdowns.modelEntity", "breakdowns.modelEntity.uuid", "created", "createdBy", "createdBy.createdBy", "documents", "documents.id", "documents.source", "groupRead", "groupWrite", "historyEdited", "historyPath", "lastModified", "lastModifiedBy", "lastModifiedBy.lastModifiedBy", "locked", "lockedBy", "objectType", "owner", "owner.owner", "ownerRead", "ownerWrite", "parentVersion", "prefix", "prefixLocked", "referenceId", "titles", "titles.languageEntity", "titles.languageEntity.defaultLanguage", "titles.languageEntity.uuid", "titles.rawTitle", "titles.title", "titles.translated", "uuid", "version", "versionLocked" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SymbolView"
                },
                "example" : {
                  "uuid" : "69439d4c-9997-4eae-9209-fb8c83f258d5",
                  "alternativeSymbol" : "OR",
                  "parentVersion" : null,
                  "version" : 0,
                  "prefix" : null,
                  "prefixLocked" : false,
                  "referenceId" : null,
                  "historyEdited" : true,
                  "objectType" : "DECISION",
                  "lockedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "documents" : [ {
                    "id" : "7d8f85e4-88b3-4818-82f0-92b3c51a59c1",
                    "source" : "mt.documents"
                  } ],
                  "ownerRead" : true,
                  "ownerWrite" : true,
                  "groupRead" : true,
                  "groupWrite" : true,
                  "allRead" : true,
                  "allWrite" : false,
                  "locked" : null,
                  "owner" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "historyPath" : null,
                  "created" : "2026-02-11T09:03:20Z",
                  "group" : "8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb",
                  "lastModifiedBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "versionLocked" : false,
                  "lastModified" : "2026-02-11T09:03:20Z",
                  "createdBy" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "titles" : {
                    "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                      "title" : ""
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Symbols" ],
        "summary" : "Delete a symbol",
        "description" : "Delete the symbol with the provided uuid.",
        "operationId" : "deleteSymbol",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c8114124-03ff-476a-a2dd-220431be4097"
        } ],
        "responses" : {
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Symbols" ],
        "summary" : "Partially update a symbol",
        "description" : "Update part of a symbol. The `group` field uses a customer-group UUID as permission-group selector. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group. Changing `group` also resets the six stored permission flags from that permission-group template.",
        "operationId" : "updateSymbol",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "symbolId",
          "in" : "path",
          "description" : "The UUID of the symbol.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "c8114124-03ff-476a-a2dd-220431be4097"
        } ],
        "requestBody" : {
          "description" : "MtbSymbolDto object",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbSymbolDto"
              },
              "examples" : {
                "Update object type" : {
                  "description" : "Update object type",
                  "value" : {
                    "objectType" : "individual"
                  }
                },
                "Update alternative symbol" : {
                  "description" : "Update alternative symbol",
                  "value" : {
                    "alternativeSymbol" : "UNISEX"
                  }
                },
                "Update reference ID" : {
                  "description" : "Update reference ID",
                  "value" : {
                    "referenceId" : "3134f6d5-9833-4f6a-a138-45de642c4216"
                  }
                },
                "Update prefix locked" : {
                  "description" : "Update prefix locked",
                  "value" : {
                    "prefixLocked" : false
                  }
                },
                "Update prefix " : {
                  "description" : "Update prefix ",
                  "value" : {
                    "prefix" : "prefix_1"
                  }
                },
                "Update titles " : {
                  "description" : "Update titles ",
                  "value" : {
                    "titles" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "title" : "Updated title"
                      }
                    }
                  }
                },
                "Update owner " : {
                  "description" : "Update owner ",
                  "value" : {
                    "owner" : "9d9e880b-64dc-4067-80df-759d8d5c7e82"
                  }
                },
                "Update group " : {
                  "description" : "Update group ",
                  "value" : {
                    "group" : "e033ad6f-e1da-423e-bbcc-f389a5481f7c"
                  }
                },
                "Update documents " : {
                  "description" : "Update documents ",
                  "value" : {
                    "documents" : [ {
                      "source" : "mt.documents",
                      "id" : "7d8f85e4-88b3-4818-82f0-92b3c51a59c1"
                    } ]
                  }
                },
                "Update breakdowns " : {
                  "description" : "Update breakdowns ",
                  "value" : {
                    "breakdowns" : [ "acfba35b-2f88-4319-beae-a4d6f23e716d" ]
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A success message.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/timestamps/{timestampId}" : {
      "get" : {
        "tags" : [ "Timestamps" ],
        "summary" : "Get a timestamp",
        "description" : "Retrieve a specific timestamp for a repository",
        "operationId" : "getTimestamp",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "timestampId",
          "in" : "path",
          "description" : "The UUID of the timestamp.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "74903c04-6c07-4d2e-bcf4-c0ad9e3335a5"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `time`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "time", "title", "type", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/TimestampView"
                },
                "example" : {
                  "uuid" : "6864cfe3-8003-4567-85df-4d84a8734379",
                  "type" : "mt-exp-imp",
                  "title" : "Auto-import: 2/11/26 1:15 PM",
                  "time" : "2026-02-11T07:45:21Z"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/timestamps" : {
      "get" : {
        "tags" : [ "Timestamps" ],
        "summary" : "List timestamps",
        "description" : "Retrieve all timestamps for a repository",
        "operationId" : "getTimestamps",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `time`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "time", "title", "type", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `time`, `title`, `type`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "time", "title", "type", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `title`, `type`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `title`, `type`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "title", "type", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/TimestampPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "6864cfe3-8003-4567-85df-4d84a8734379",
                    "type" : "mt-exp-imp",
                    "title" : "Auto-import: 2/11/26 1:15 PM",
                    "time" : "2026-02-11T07:45:21Z"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/images" : {
      "get" : {
        "tags" : [ "Images" ],
        "summary" : "List images",
        "description" : "Retrieve all images for a repository",
        "operationId" : "getImages",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `title`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "title", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `content`, `title`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "title", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `title`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `title`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "title", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ImagePage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "986bcf24-2d5b-409b-b9f2-d36886f0eb69",
                    "title" : "example1",
                    "content" : "Base64String"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Images" ],
        "summary" : "Create an image",
        "description" : "Create an image with the provided values",
        "operationId" : "postImage",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        } ],
        "requestBody" : {
          "description" : "MtbUserImageDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbUserImageDto"
              },
              "examples" : {
                "Default" : {
                  "description" : "Default",
                  "value" : {
                    "title" : "example1",
                    "content" : "Base64EncodedImage"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbUserImageDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/images/{imageId}" : {
      "get" : {
        "tags" : [ "Images" ],
        "summary" : "Get image content",
        "description" : "Get image content",
        "operationId" : "getUserImageContent",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "imageId",
          "in" : "path",
          "description" : "The UUID of the image.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "2b089e13-167a-4a79-8880-c7d8fae5edaf"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `content`, `title`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "content", "title", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ImageView"
                },
                "example" : {
                  "uuid" : "986bcf24-2d5b-409b-b9f2-d36886f0eb69",
                  "title" : "example1",
                  "content" : "Base64String"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Images" ],
        "summary" : "Delete an image",
        "description" : "Delete the image with the provided uuid",
        "operationId" : "deleteImage",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "imageId",
          "in" : "path",
          "description" : "The UUID of the image.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e76e9aec-4f22-442a-a0eb-f24985e0c231"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Images" ],
        "summary" : "Update an image",
        "description" : "Update an image",
        "operationId" : "patchImage",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "imageId",
          "in" : "path",
          "description" : "The UUID of the image.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e76e9aec-4f22-442a-a0eb-f24985e0c231"
        } ],
        "requestBody" : {
          "description" : "MtbUserImageDto",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbUserImageDto"
              },
              "examples" : {
                "Update image title" : {
                  "description" : "Update image title",
                  "value" : {
                    "title" : "example1"
                  }
                },
                "Update image content" : {
                  "description" : "Update image content",
                  "value" : {
                    "content" : "Base64EncodedImage"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/users/{userId}/properties/{providerId}" : {
      "get" : {
        "tags" : [ "Users" ],
        "summary" : "List properties for a user",
        "description" : "Retrieve the user's properties. The provider path segment is required, but this list operation currently does not filter by provider.",
        "operationId" : "getUserProperty",
        "parameters" : [ {
          "name" : "providerId",
          "in" : "path",
          "description" : "Required provider segment. The list currently does not filter by this value.",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "mt-server"
        }, {
          "name" : "userId",
          "in" : "path",
          "description" : "The UUID of the user.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d46070f8-4e55-4c4b-bd61-8e6b5b45e94b"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `key`, `value`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `value`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `value`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "key" : "e9f89bbd-034e-4589-bf77-f5291ee93bf2",
                    "value" : "setting-values"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials. This endpoint also returns 401 when the caller is neither the requested user nor an administrator."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Users" ],
        "summary" : "Create a user property",
        "description" : "Create a property for a user and provider",
        "operationId" : "createUserProperty",
        "parameters" : [ {
          "name" : "userId",
          "in" : "path",
          "description" : "The UUID of the user.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d46070f8-4e55-4c4b-bd61-8e6b5b45e94b"
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "description" : "The user property to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPropertiesDto"
              },
              "examples" : {
                "Default" : {
                  "summary" : "Create user property",
                  "description" : "Full payload with property key and value for creation.",
                  "value" : {
                    "key" : "54ba5bfa-1c3c-4e2b-9c90-d1ef35b5aee5",
                    "value" : "test-value"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPropertiesDto"
                },
                "example" : {
                  "key" : "54ba5bfa-1c3c-4e2b-9c90-d1ef35b5aee5",
                  "value" : "test-value"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/users/{userId}/properties/{providerId}/{key}" : {
      "get" : {
        "tags" : [ "Users" ],
        "summary" : "Get a property for a user",
        "description" : "Retrieve a specific property for a user",
        "operationId" : "getUserPropertyByKey",
        "parameters" : [ {
          "name" : "userId",
          "in" : "path",
          "description" : "The UUID of the user.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d46070f8-4e55-4c4b-bd61-8e6b5b45e94b"
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "mt-server"
        }, {
          "name" : "key",
          "in" : "path",
          "description" : "The property key.",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "c34c84a3-c361-4de9-855d-fcda148d3a7f.preferredGroup"
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbPropertiesDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Users" ],
        "summary" : "Delete a user property",
        "description" : "Deletes a specific user property for a user.",
        "operationId" : "deleteUserProperty",
        "parameters" : [ {
          "name" : "userId",
          "in" : "path",
          "description" : "The UUID of the user.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d46070f8-4e55-4c4b-bd61-8e6b5b45e94b"
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "key",
          "in" : "path",
          "description" : "The property key. This endpoint currently requires a UUID-formatted key.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "e5cbac72-b6b4-4193-a421-a61033e474b3"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "patch" : {
        "tags" : [ "Users" ],
        "summary" : "Update an existing user property partially",
        "description" : "Applies a partial update to an existing user property. Only fields provided in the request body will be updated.",
        "operationId" : "updateUserProperty",
        "parameters" : [ {
          "name" : "userId",
          "in" : "path",
          "description" : "The UUID of the user.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "d46070f8-4e55-4c4b-bd61-8e6b5b45e94b"
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier (a string, not necessarily a UUID).",
          "required" : true,
          "schema" : {
            "type" : "string"
          },
          "example" : "mt-server"
        }, {
          "name" : "key",
          "in" : "path",
          "description" : "The property key. This endpoint currently requires a UUID-formatted key.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "User property data to update. Only non-null fields will be applied.",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbPropertiesDto"
              },
              "examples" : {
                "Update value" : {
                  "summary" : "Update only the value field",
                  "description" : "Minimal PATCH payload for changing the property value.",
                  "value" : {
                    "value" : "updated-value"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/users/{userId}" : {
      "get" : {
        "tags" : [ "Users" ],
        "summary" : "Get a user",
        "description" : "Retrieve a specific user.",
        "operationId" : "getUser",
        "parameters" : [ {
          "name" : "userId",
          "in" : "path",
          "description" : "The UUID of the user.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "0b2d7f07-6f4f-410e-82a6-69b97faf9c86"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `administrator`, `avatar`, `disabled`, `email`, `firstName`, `lastName`, `lastSeen`, `privileges`, `repositories`, `repositories.repositoryEntity`, `repositories.repositoryEntity.uuid`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "administrator", "avatar", "disabled", "email", "firstName", "lastName", "lastSeen", "privileges", "repositories", "repositories.repositoryEntity", "repositories.repositoryEntity.uuid", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/UserView"
                },
                "example" : {
                  "uuid" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                  "email" : "john.doe@example.com",
                  "firstName" : "John",
                  "lastName" : "Doe",
                  "administrator" : true,
                  "lastSeen" : 1713896743511,
                  "disabled" : false,
                  "privileges" : [ "CREATE_REPOSITORY" ],
                  "avatar" : "/me.jpg",
                  "repositories" : [ {
                    "uuid" : "603055e8-4734-461e-bf42-d4456afe7bb7"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/users" : {
      "get" : {
        "tags" : [ "Users" ],
        "summary" : "List users",
        "description" : "Retrieve all users.",
        "operationId" : "getUsers",
        "parameters" : [ {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `administrator`, `avatar`, `disabled`, `email`, `firstName`, `lastName`, `lastSeen`, `privileges`, `repositories`, `repositories.repositoryEntity`, `repositories.repositoryEntity.uuid`, `uuid`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "administrator", "avatar", "disabled", "email", "firstName", "lastName", "lastSeen", "privileges", "repositories", "repositories.repositoryEntity", "repositories.repositoryEntity.uuid", "uuid" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`, `SIMPLE`. Omit to use `DEFAULT`. Projection names are case-insensitive. `SIMPLE` selects the resource's compact field set. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL", "SIMPLE" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `administrator`, `avatar`, `disabled`, `email`, `firstName`, `lastName`, `lastSeen`, `privileges`, `uuid`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "administrator", "avatar", "disabled", "email", "firstName", "lastName", "lastSeen", "privileges", "uuid" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `avatar`, `email`, `firstName`, `lastName`, `repositories`, `repositories.repositoryEntity`, `repositories.repositoryEntity.uuid`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `avatar`, `email`, `firstName`, `lastName`, `repositories`, `repositories.repositoryEntity`, `repositories.repositoryEntity.uuid`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "avatar", "email", "firstName", "lastName", "repositories", "repositories.repositoryEntity", "repositories.repositoryEntity.uuid", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/UserPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "uuid" : "454f032c-2b91-482f-834f-abe08bbb8d52",
                    "email" : "john.doe@example.com",
                    "firstName" : "John",
                    "lastName" : "Doe",
                    "administrator" : true,
                    "lastSeen" : 1713896743511,
                    "disabled" : false,
                    "privileges" : [ "CREATE_REPOSITORY" ],
                    "avatar" : "/me.jpg",
                    "repositories" : [ {
                      "uuid" : "603055e8-4734-461e-bf42-d4456afe7bb7"
                    } ]
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/versions" : {
      "get" : {
        "tags" : [ "Versions" ],
        "summary" : "Get versions",
        "description" : "Get the versions of the MT backend REST API and the underlying database.",
        "operationId" : "getVersions",
        "responses" : {
          "200" : {
            "description" : "A JSON object with the versions as properties.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/VersionsResponse"
                }
              }
            }
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/vertices/{vertexId}/properties/{providerId}" : {
      "get" : {
        "tags" : [ "Vertices" ],
        "summary" : "Get vertex properties for a vertex and provider",
        "description" : "Get the vertex properties for a vertex and provider. The vertex is identified by the vertex ID in the path and the provider is identified by the provider ID in the path. The response is a list of vertex properties for the specified vertex and provider.",
        "operationId" : "getVertexProperties",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "vertexId",
          "in" : "path",
          "description" : "The UUID of the vertex.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier. This endpoint currently requires a UUID-formatted provider identifier.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `key`, `value`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `key`, `value`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `key`, `value`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `key`, `value`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "key", "value" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyPage"
                },
                "example" : {
                  "startAt" : 0,
                  "maxResults" : 10,
                  "total" : 1,
                  "data" : [ {
                    "key" : "prop-name-1",
                    "value" : "prop-value-1"
                  }, {
                    "key" : "prop-name-2",
                    "value" : "prop-value-2"
                  } ]
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/vertices/{vertexId}/properties/{providerId}/{key}" : {
      "get" : {
        "tags" : [ "Vertices" ],
        "summary" : "Get a vertex property for a vertex, provider and key",
        "description" : "Retrieve a specific vertex property for a repository",
        "operationId" : "getVertexProperty",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "vertexId",
          "in" : "path",
          "description" : "The UUID of the vertex.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "providerId",
          "in" : "path",
          "description" : "The property provider identifier. This endpoint currently requires a UUID-formatted provider identifier.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "key",
          "in" : "path",
          "description" : "The property key.",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A resource object is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PropertyView"
                },
                "example" : {
                  "key" : "prop-name-1",
                  "value" : "prop-value-1"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/canvas/vertices" : {
      "get" : {
        "tags" : [ "Vertices" ],
        "summary" : "List vertices",
        "description" : "Retrieve all vertices for a repository.",
        "operationId" : "listVertices",
        "parameters" : [ {
          "name" : "sortLanguage",
          "in" : "query",
          "description" : "Language UUID used when sortBy=symbol.titles.title. Defaults to the repository default language.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        }, {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "80c41767-0247-4f60-9d58-c5e925ff8585"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `border`, `breakDownSymbol`, `centerLabel`, `elidable`, `height`, `historyEdited`, `historyPath`, `image`, `inputs`, `inputs.uuid`, `labelBounds`, `labelBounds.height`, `labelBounds.languageEntity`, `labelBounds.languageEntity.id`, `labelBounds.languageEntity.languageUUID`, `labelBounds.width`, `labelBounds.x`, `labelBounds.y`, `labelTextColor`, `labelTextFont`, `labelTextSize`, `labelTextStyle`, `layer`, `layer.layer`, `lockLabel`, `lockProportions`, `locked`, `manualLabelColor`, `outputs`, `outputs.uuid`, `owningDataObject`, `showLabel`, `sizeRatio`, `symbol`, `symbol.titles`, `symbol.titles.languageEntity`, `symbol.titles.languageEntity.defaultLanguage`, `symbol.titles.languageEntity.uuid`, `symbol.titles.rawTitle`, `symbol.titles.title`, `symbol.titles.translated`, `symbol.uuid`, `symbol.version`, `transformBr`, `transformHue`, `transformRGB`, `transformSat`, `uuid`, `width`, `x`, `y`, `zOrder`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "border", "breakDownSymbol", "centerLabel", "elidable", "height", "historyEdited", "historyPath", "image", "inputs", "inputs.uuid", "labelBounds", "labelBounds.height", "labelBounds.languageEntity", "labelBounds.languageEntity.id", "labelBounds.languageEntity.languageUUID", "labelBounds.width", "labelBounds.x", "labelBounds.y", "labelTextColor", "labelTextFont", "labelTextSize", "labelTextStyle", "layer", "layer.layer", "lockLabel", "lockProportions", "locked", "manualLabelColor", "outputs", "outputs.uuid", "owningDataObject", "showLabel", "sizeRatio", "symbol", "symbol.titles", "symbol.titles.languageEntity", "symbol.titles.languageEntity.defaultLanguage", "symbol.titles.languageEntity.uuid", "symbol.titles.rawTitle", "symbol.titles.title", "symbol.titles.translated", "symbol.uuid", "symbol.version", "transformBr", "transformHue", "transformRGB", "transformSat", "uuid", "width", "x", "y", "zOrder" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        }, {
          "name" : "startAt",
          "in" : "query",
          "description" : "The index to start fetching results from, with 0 representing the first index and maxResults - 1 being the last index.",
          "schema" : {
            "minimum" : 0,
            "type" : "string",
            "default" : "0"
          }
        }, {
          "name" : "maxResults",
          "in" : "query",
          "description" : "The maximum number of results to fetch.",
          "schema" : {
            "type" : "string",
            "default" : "10"
          }
        }, {
          "name" : "sortBy",
          "in" : "query",
          "description" : "Optional sort path: `border`, `breakDownSymbol`, `centerLabel`, `elidable`, `height`, `historyEdited`, `historyPath`, `image`, `labelTextColor`, `labelTextFont`, `labelTextSize`, `labelTextStyle`, `layer.layer`, `lockLabel`, `lockProportions`, `locked`, `manualLabelColor`, `owningDataObject`, `showLabel`, `sizeRatio`, `symbol.uuid`, `symbol.version`, `transformBr`, `transformHue`, `transformRGB`, `transformSat`, `uuid`, `width`, `x`, `y`, `zOrder`. Names are case-insensitive. Omit to use internal identifier ordering. Use one scalar path, not an association container. You can also sort by `symbol.titles.title` using `sortLanguage` (one language UUID from this repository). Omit `sortLanguage` to use the repository's default language; a default language must exist. Other collection sorts require a qualifier and are not offered here.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "border", "breakDownSymbol", "centerLabel", "elidable", "height", "historyEdited", "historyPath", "image", "labelTextColor", "labelTextFont", "labelTextSize", "labelTextStyle", "layer.layer", "lockLabel", "lockProportions", "locked", "manualLabelColor", "owningDataObject", "showLabel", "sizeRatio", "symbol.uuid", "symbol.version", "transformBr", "transformHue", "transformRGB", "transformSat", "uuid", "width", "x", "y", "zOrder", "symbol.titles.title" ],
          "x-2c8-localized-sort-values" : [ "symbol.titles.title" ]
        }, {
          "name" : "ascending",
          "in" : "query",
          "description" : "True to sort in ascending order and false to sort in descending order.",
          "schema" : {
            "type" : "string",
            "enum" : [ "true", "false" ],
            "default" : "true"
          }
        }, {
          "name" : "filter",
          "in" : "query",
          "description" : "Optional case-insensitive text match. Use `*` as a wildcard, for example `*Process*`; escape a literal asterisk with a backslash. Use `filterFields` to choose from `border`, `historyPath`, `image`, `inputs`, `inputs.uuid`, `labelBounds`, `labelBounds.languageEntity`, `labelBounds.languageEntity.languageUUID`, `labelTextFont`, `layer`, `layer.layer`, `outputs`, `outputs.uuid`, `symbol`, `symbol.titles`, `symbol.titles.languageEntity`, `symbol.titles.languageEntity.uuid`, `symbol.titles.rawTitle`, `symbol.titles.title`, `symbol.uuid`, `uuid`. Omit `filterFields` to search selected fields. Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate.",
          "schema" : {
            "type" : "string",
            "default" : ""
          }
        }, {
          "name" : "filterFields",
          "in" : "query",
          "description" : "Optional comma-separated filter paths: `border`, `historyPath`, `image`, `inputs`, `inputs.uuid`, `labelBounds`, `labelBounds.languageEntity`, `labelBounds.languageEntity.languageUUID`, `labelTextFont`, `layer`, `layer.layer`, `outputs`, `outputs.uuid`, `symbol`, `symbol.titles`, `symbol.titles.languageEntity`, `symbol.titles.languageEntity.uuid`, `symbol.titles.rawTitle`, `symbol.titles.title`, `symbol.uuid`, `uuid`. Names are case-insensitive. Omit to search the selected fields (projection plus fields). Association paths search their text children. Matching uses stored text before response transformations; non-text values do not participate. Field access still depends on privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "border", "historyPath", "image", "inputs", "inputs.uuid", "labelBounds", "labelBounds.languageEntity", "labelBounds.languageEntity.languageUUID", "labelTextFont", "layer", "layer.layer", "outputs", "outputs.uuid", "symbol", "symbol.titles", "symbol.titles.languageEntity", "symbol.titles.languageEntity.uuid", "symbol.titles.rawTitle", "symbol.titles.title", "symbol.uuid", "uuid" ]
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/VertexPage"
                },
                "examples" : {
                  "Created edge response" : {
                    "description" : "Created edge response",
                    "value" : {
                      "startAt" : 0,
                      "maxResults" : 10,
                      "total" : 2,
                      "data" : [ {
                        "symbol" : {
                          "version" : 0,
                          "uuid" : "69439d4c-9997-4eae-9209-fb8c83f258d5"
                        },
                        "uuid" : "b5e530ca-f4a0-416e-ae4d-0406d48c3eb7",
                        "x" : 366,
                        "y" : 114,
                        "width" : 30,
                        "height" : 30,
                        "sizeRatio" : 1.0,
                        "lockProportions" : false,
                        "zOrder" : 0,
                        "labelBounds" : {
                          "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                            "x" : 367,
                            "y" : 99,
                            "height" : 12,
                            "width" : 28
                          }
                        },
                        "centerLabel" : false,
                        "labelTextFont" : "Arial",
                        "labelTextSize" : 11,
                        "labelTextStyle" : 0,
                        "labelTextColor" : -16777216,
                        "manualLabelColor" : false,
                        "lockLabel" : false,
                        "showLabel" : true,
                        "image" : "/api/v1/icons/factory.png?size=48",
                        "transformRGB" : null,
                        "transformBr" : null,
                        "transformHue" : null,
                        "transformSat" : null,
                        "border" : null,
                        "locked" : false,
                        "outputs" : [ ],
                        "inputs" : [ ],
                        "layer" : null,
                        "elidable" : false,
                        "breakDownSymbol" : false,
                        "historyEdited" : true,
                        "historyPath" : null,
                        "owningDataObject" : true,
                        "titles" : {
                          "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                            "title" : ""
                          }
                        }
                      }, {
                        "symbol" : {
                          "version" : 0,
                          "uuid" : "f25e634b-b2d9-4c89-a6be-81c69d05f9aa"
                        },
                        "uuid" : "81bade47-8d1b-4a21-a4df-5d848d36d861",
                        "x" : 304,
                        "y" : 231,
                        "width" : 18,
                        "height" : 18,
                        "sizeRatio" : 1.0,
                        "lockProportions" : false,
                        "zOrder" : 1,
                        "labelBounds" : {
                          "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                            "x" : 299,
                            "y" : 252,
                            "height" : 12,
                            "width" : 28
                          }
                        },
                        "centerLabel" : false,
                        "labelTextFont" : "Arial",
                        "labelTextSize" : 11,
                        "labelTextStyle" : 0,
                        "labelTextColor" : -16777216,
                        "manualLabelColor" : false,
                        "lockLabel" : false,
                        "showLabel" : true,
                        "image" : "/api/v1/icons/factory.png?size=48",
                        "transformRGB" : null,
                        "transformBr" : null,
                        "transformHue" : null,
                        "transformSat" : null,
                        "border" : null,
                        "locked" : false,
                        "outputs" : [ ],
                        "inputs" : [ ],
                        "layer" : null,
                        "elidable" : false,
                        "breakDownSymbol" : false,
                        "historyEdited" : true,
                        "historyPath" : null,
                        "owningDataObject" : true,
                        "titles" : {
                          "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                            "title" : ""
                          }
                        }
                      } ]
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "post" : {
        "tags" : [ "Vertices" ],
        "summary" : "Create a vertex",
        "description" : "Create a new vertex for a model in a repository",
        "operationId" : "createVertex",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        } ],
        "requestBody" : {
          "description" : "The vertex to create",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbVertexDto"
              },
              "examples" : {
                "Minimal" : {
                  "description" : "Minimal",
                  "value" : {
                    "x" : 100,
                    "y" : 120,
                    "width" : 140,
                    "height" : 90,
                    "symbol" : "69439d4c-9997-4eae-9209-fb8c83f258d5"
                  }
                },
                "With other properties" : {
                  "description" : "With other properties",
                  "value" : {
                    "x" : 100,
                    "y" : 120,
                    "width" : 140,
                    "height" : 90,
                    "zOrder" : 3,
                    "symbol" : "69439d4c-9997-4eae-9209-fb8c83f258d5",
                    "properties" : {
                      "partner_plugin" : {
                        "Property1" : "value1"
                      }
                    },
                    "border" : {
                      "dashPattern" : [ 5.0, 3.0 ],
                      "width" : 2.5,
                      "color" : {
                        "space" : "SRGB",
                        "red" : 255,
                        "green" : 0,
                        "blue" : 0
                      }
                    },
                    "lockProportions" : true,
                    "centerLabel" : true,
                    "labelTextFont" : "Times new",
                    "labelTextSize" : 100,
                    "labelTextStyle" : "BOLD",
                    "labelTextColor" : "#000001",
                    "showLabel" : true,
                    "image" : "/api/v1/icons/factory.png?size=48",
                    "locked" : true,
                    "holder" : true,
                    "owningDataObject" : true,
                    "labels" : {
                      "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                        "x" : 100,
                        "y" : 120,
                        "width" : 140,
                        "height" : 90
                      }
                    }
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbVertexDto"
                },
                "examples" : {
                  "Created vertex response" : {
                    "description" : "Created vertex response",
                    "value" : {
                      "uuid" : "0f3fcf34-9ecb-42e1-8bb5-8fe9e7e5b0e5",
                      "x" : 100,
                      "y" : 120,
                      "width" : 140,
                      "height" : 90,
                      "zOrder" : 3,
                      "accessLevel" : null,
                      "sizeRatio" : 1.0,
                      "lockProportions" : false,
                      "labels" : {
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : { }
                      },
                      "centerLabel" : false,
                      "labelTextFont" : "Arial",
                      "labelTextSize" : 11,
                      "labelTextStyle" : "PLAIN",
                      "labelTextColor" : "#000000",
                      "manualLabelColor" : false,
                      "showLabel" : true,
                      "image" : "/api/v1/icons/factory.png?size=48",
                      "border" : null,
                      "color" : null,
                      "locked" : false,
                      "holder" : false,
                      "owningDataObject" : false,
                      "symbol" : "69439d4c-9997-4eae-9209-fb8c83f258d5"
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/{repositoryId}/models/{modelId}/canvas/vertices/{vertexId}" : {
      "get" : {
        "tags" : [ "Vertices" ],
        "summary" : "Get a repository model vertex",
        "description" : "Retrieve a vertex for a model",
        "operationId" : "getVertex",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "60aaa77a-378d-4bec-be12-b8e16b37efec"
        }, {
          "name" : "vertexId",
          "in" : "path",
          "description" : "The UUID of the vertex.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "80c41767-0247-4f60-9d58-c5e925ff8585"
        }, {
          "name" : "fields",
          "in" : "query",
          "description" : "Optional comma-separated selection paths: `border`, `breakDownSymbol`, `centerLabel`, `elidable`, `height`, `historyEdited`, `historyPath`, `image`, `inputs`, `inputs.uuid`, `labelBounds`, `labelBounds.height`, `labelBounds.languageEntity`, `labelBounds.languageEntity.id`, `labelBounds.languageEntity.languageUUID`, `labelBounds.width`, `labelBounds.x`, `labelBounds.y`, `labelTextColor`, `labelTextFont`, `labelTextSize`, `labelTextStyle`, `layer`, `layer.layer`, `lockLabel`, `lockProportions`, `locked`, `manualLabelColor`, `outputs`, `outputs.uuid`, `owningDataObject`, `showLabel`, `sizeRatio`, `symbol`, `symbol.titles`, `symbol.titles.languageEntity`, `symbol.titles.languageEntity.defaultLanguage`, `symbol.titles.languageEntity.uuid`, `symbol.titles.rawTitle`, `symbol.titles.title`, `symbol.titles.translated`, `symbol.uuid`, `symbol.version`, `transformBr`, `transformHue`, `transformRGB`, `transformSat`, `uuid`, `width`, `x`, `y`, `zOrder`. Names are case-insensitive. Omit to use the projection; explicit fields and projection fields are combined. Association names select their child fields. These are request paths; response transformations can rename or flatten them. Some fields require additional privileges.",
          "schema" : {
            "type" : "string"
          },
          "x-2c8-supported-values" : [ "border", "breakDownSymbol", "centerLabel", "elidable", "height", "historyEdited", "historyPath", "image", "inputs", "inputs.uuid", "labelBounds", "labelBounds.height", "labelBounds.languageEntity", "labelBounds.languageEntity.id", "labelBounds.languageEntity.languageUUID", "labelBounds.width", "labelBounds.x", "labelBounds.y", "labelTextColor", "labelTextFont", "labelTextSize", "labelTextStyle", "layer", "layer.layer", "lockLabel", "lockProportions", "locked", "manualLabelColor", "outputs", "outputs.uuid", "owningDataObject", "showLabel", "sizeRatio", "symbol", "symbol.titles", "symbol.titles.languageEntity", "symbol.titles.languageEntity.defaultLanguage", "symbol.titles.languageEntity.uuid", "symbol.titles.rawTitle", "symbol.titles.title", "symbol.titles.translated", "symbol.uuid", "symbol.version", "transformBr", "transformHue", "transformRGB", "transformSat", "uuid", "width", "x", "y", "zOrder" ]
        }, {
          "name" : "projection",
          "in" : "query",
          "description" : "Supported projections: `DEFAULT`, `ALL`. Omit to use `DEFAULT`. Projection names are case-insensitive. `ALL` selects all available fields. Field access still depends on your privileges.",
          "schema" : {
            "type" : "string",
            "enum" : [ "DEFAULT", "ALL" ],
            "default" : "DEFAULT"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "A list of resource objects is returned.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/VertexView"
                },
                "examples" : {
                  "Created edge response" : {
                    "description" : "Created edge response",
                    "value" : {
                      "symbol" : {
                        "version" : 0,
                        "uuid" : "69439d4c-9997-4eae-9209-fb8c83f258d5"
                      },
                      "uuid" : "b5e530ca-f4a0-416e-ae4d-0406d48c3eb7",
                      "x" : 366,
                      "y" : 114,
                      "width" : 30,
                      "height" : 30,
                      "sizeRatio" : 1.0,
                      "lockProportions" : false,
                      "zOrder" : 0,
                      "labelBounds" : {
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                          "x" : 367,
                          "y" : 99,
                          "height" : 12,
                          "width" : 28
                        }
                      },
                      "centerLabel" : false,
                      "labelTextFont" : "Arial",
                      "labelTextSize" : 11,
                      "labelTextStyle" : 0,
                      "labelTextColor" : -16777216,
                      "manualLabelColor" : false,
                      "lockLabel" : false,
                      "showLabel" : true,
                      "image" : "/api/v1/icons/factory.png?size=48",
                      "transformRGB" : null,
                      "transformBr" : null,
                      "transformHue" : null,
                      "transformSat" : null,
                      "border" : null,
                      "locked" : false,
                      "outputs" : [ ],
                      "inputs" : [ ],
                      "layer" : null,
                      "elidable" : false,
                      "breakDownSymbol" : false,
                      "historyEdited" : true,
                      "historyPath" : null,
                      "owningDataObject" : true,
                      "titles" : {
                        "b030a9f8-a89c-41c4-a972-0da5763c4d95" : {
                          "title" : ""
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For reads, wait at least Retry-After, add small random jitter, and reduce concurrency. Bound both retries and total elapsed time (for example, at most 3 retries within 60 seconds as a client policy). Stop if the next wait exceeds that budget; avoid an immediate retry loop even when the reported wait is zero. Another retry may still receive 429.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      },
      "delete" : {
        "tags" : [ "Vertices" ],
        "summary" : "Delete a vertex",
        "description" : "Delete a specific vertex from a model in a repository",
        "operationId" : "deleteVertex",
        "parameters" : [ {
          "name" : "repositoryId",
          "in" : "path",
          "description" : "The UUID of the repository.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "5bda3e9f-ff66-45df-8c58-33a70df059df"
        }, {
          "name" : "modelId",
          "in" : "path",
          "description" : "The UUID of the model.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "6ceb4f10-ff66-46ab-9d69-22b81ef169e0"
        }, {
          "name" : "vertexId",
          "in" : "path",
          "description" : "The UUID of the vertex.",
          "required" : true,
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          },
          "example" : "cc217c21-8c3d-495e-97ff-f116ac67c0ce"
        } ],
        "responses" : {
          "204" : {
            "description" : "No Content. Server successfully processed the request but returned no content.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/repositories/draft/models" : {
      "post" : {
        "tags" : [ "Models" ],
        "summary" : "Create a draft model",
        "description" : "Create a model in the draft repository, which is created on first use. The `draft` path segment is case-insensitive. Use the separate repository-UUID endpoint to create a normal model. The request title is stored under the draft repository default language. The request body `group` and the `2c8-Permission-Group` header use customer-group UUIDs. If both are provided, the request body `group` takes precedence. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
        "operationId" : "createDraftModel",
        "parameters" : [ {
          "name" : "2c8-Permission-Group",
          "in" : "header",
          "description" : "Optional customer-group UUID used as permission-group selector when the request body does not provide `group`. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
          "schema" : {
            "type" : "string",
            "format" : "uuid"
          }
        } ],
        "requestBody" : {
          "description" : "Draft model data to create. The title is stored under the draft repository default language.",
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MtbDraftCreateDto"
              },
              "examples" : {
                "Example draft model" : {
                  "description" : "Example draft model",
                  "value" : {
                    "title" : "Draft model",
                    "modelType" : "GENERAL_MODEL"
                  }
                }
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "description" : "Created. Request has been successfully created",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MtbModelDto"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request. Something is wrong with the request provided, see response message for details."
          },
          "401" : {
            "description" : "Unauthorized. Authentication is missing or invalid. Check the API key or session credentials."
          },
          "403" : {
            "description" : "Forbidden. You are not allowed to access the resource, or some part of the resource. See the response message for details."
          },
          "404" : {
            "description" : "Resource not found"
          },
          "500" : {
            "description" : "An internal server error occurred. Please check the server logs or contact 2c8 Support if you are using a hosted service."
          },
          "429" : {
            "description" : "Too many requests for the authenticated identity. Limits are installation-specific. The global request filter skips OPTIONS, requests without a principal, and API keys configured without rate limiting. A named anonymous principal (for example, on /versions) is still subject to the limiter. This backend rejection occurs before the resource operation runs. Retry-After and retryAfterSeconds report the same non-negative wait in seconds; the example quota is illustrative. For writes, retry only after a confirmed rejection when no earlier attempt has an uncertain outcome, using the returned wait and a bounded retry budget. Do not automatically repeat a write after a timeout, lost connection or server error: it may already have taken effect. Read back the resulting state and reconcile before resubmitting. A later 429 does not resolve the outcome of an earlier attempt.",
            "headers" : {
              "X-RateLimit-Limit" : {
                "$ref" : "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining" : {
                "$ref" : "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset" : {
                "$ref" : "#/components/headers/X-RateLimit-Reset"
              },
              "Retry-After" : {
                "$ref" : "#/components/headers/Retry-After"
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RateLimitErrorResponse"
                },
                "example" : {
                  "error" : "Rate limit exceeded",
                  "message" : "Maximum 60 requests",
                  "retryAfterSeconds" : 12
                }
              }
            }
          }
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "RenderedSymbolName" : {
        "type" : "string",
        "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT", "AND", "OR", "FIGURE_TORSO", "FIGURE_FULL", "MAN", "WOMAN", "UNISEX", "GAUGE" ]
      },
      "RenderedModelName" : {
        "type" : "string",
        "enum" : [ "GENERAL_MODEL", "INTERESTED_PARTY_MODEL", "REQUIREMENT_MODEL", "PROCESS_MODEL", "PRODUCT_MODEL", "PROJECT_MODEL", "ORGANISATION_MODEL", "SWIMLANE_MODEL", "INFORMATION_MODEL", "CONCEPT_MODEL", "BPMN_MODEL", "APPLICATION_MODEL", "CAPABILITY_MODEL" ]
      },
      "RenderedEdgeName" : {
        "type" : "string",
        "enum" : [ "CONSISTS_OF", "PERFORMS", "IS_A_KIND_OF", "RACI_RESPONSIBLE", "RACI_ACCOUNTABLE", "RACI_CONSULTANT", "RACI_INFORMED", "IS_A_PART_OF", "CORRESPONDS_WITH", "SECONDARY_FLOW", "ADRESSES", "IS_SITUATED_AT", "HANDLES", "IS_SPECIALISED_IN", "DEFINES", "INTERRELATES_WITH", "BELONGS_TO", "VERIFICATION_FLOW", "CAN_PLAY", "IS_FOLLOWED_BY", "FLOW", "IS_USED_BY", "CONTROLS", "IS_EMPOWERED", "SUPPORTS", "REQUIRES", "REALIZE", "BPMN_ASSOCIATION", "BPMN_MESSAGE_FLOW", "BPMN_SEQUENCE_FLOW", "CONCEPT_RELATION_TO", "MANY_TO_MANY", "ONE_TO_MANY", "ONE_TO_ONE", "TRIGGER" ]
      },
      "MtbDocumentIdDto" : {
        "type" : "object",
        "properties" : {
          "source" : {
            "type" : "string"
          },
          "id" : {
            "type" : "string"
          }
        }
      },
      "MtbModelDto" : {
        "type" : "object",
        "properties" : {
          "modelType" : {
            "type" : "string",
            "description" : "Model type for the model.",
            "example" : "GENERAL_MODEL"
          },
          "alternativeId" : {
            "type" : "string",
            "description" : "Optional alternative ID for the model.",
            "nullable" : true
          },
          "prefix" : {
            "type" : "string",
            "description" : "Optional model prefix.",
            "nullable" : true
          },
          "prefixLocked" : {
            "type" : "boolean",
            "description" : "Whether the model prefix should be locked.",
            "nullable" : true,
            "example" : false
          },
          "documents" : {
            "type" : "array",
            "description" : "Optional list of linked documents.",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbDocumentIdDto"
            }
          },
          "owner" : {
            "type" : "string",
            "description" : "Optional owner UUID. Requires admin access.",
            "nullable" : true
          },
          "group" : {
            "type" : "string",
            "description" : "Optional customer-group UUID used as the permission-group selector. If omitted on POST, the `2c8-Permission-Group` header fallback is used. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group."
          },
          "notify" : {
            "type" : "boolean",
            "description" : "Whether notifications should be enabled for the created model.",
            "nullable" : true,
            "example" : false
          },
          "ownerRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "ownerWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "groupRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "groupWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "allRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "allWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : false
          },
          "subscribers" : {
            "type" : "array",
            "description" : "Optional subscriber UUIDs to attach to the created model.",
            "items" : {
              "type" : "string"
            }
          },
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbTitleDto"
            }
          }
        }
      },
      "MtbTitleDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string"
          },
          "translated" : {
            "type" : "boolean"
          }
        }
      },
      "MtbDraftAcceptDto" : {
        "type" : "object",
        "properties" : {
          "repository" : {
            "type" : "string",
            "description" : "UUID of the target repository.",
            "example" : "603055e8-4734-461e-bf42-d4456afe7bb7"
          },
          "modelType" : {
            "type" : "string",
            "description" : "Model type for the imported model.",
            "example" : "GENERAL_MODEL"
          },
          "title" : {
            "type" : "string",
            "description" : "Title to use for the imported model.",
            "example" : "Imported draft"
          },
          "group" : {
            "type" : "string",
            "description" : "Optional customer-group UUID used as the permission-group selector. If omitted, the `2c8-Permission-Group` header fallback is used. If both are present, the request body value takes precedence. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group."
          },
          "maintainers" : {
            "type" : "array",
            "description" : "Users to assign as maintainers in the imported model.",
            "items" : {
              "type" : "string"
            }
          },
          "reviewers" : {
            "type" : "array",
            "description" : "Users to assign as reviewers in the imported model.",
            "items" : {
              "type" : "string"
            }
          },
          "approvers" : {
            "type" : "array",
            "description" : "Users to assign as approvers in the imported model.",
            "items" : {
              "type" : "string"
            }
          }
        },
        "description" : "Request payload used when accepting a draft from the Lite repository into a target repository.\n"
      },
      "MtbAccessorDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "user", "group" ]
          },
          "user" : {
            "type" : "string",
            "format" : "uuid"
          },
          "group" : {
            "type" : "string",
            "format" : "uuid"
          },
          "privileges" : {
            "$ref" : "#/components/schemas/MtbPrivilegesDto"
          }
        }
      },
      "MtbPrivilegesDto" : {
        "type" : "object",
        "properties" : {
          "throwOut" : {
            "type" : "boolean"
          },
          "snapshotLock" : {
            "type" : "boolean"
          },
          "languageEdit" : {
            "type" : "boolean"
          },
          "snapshotCreate" : {
            "type" : "boolean"
          },
          "manageUsers" : {
            "type" : "boolean"
          },
          "manageLayers" : {
            "type" : "boolean"
          },
          "manageLists" : {
            "type" : "boolean"
          },
          "exportData" : {
            "type" : "boolean"
          },
          "publish" : {
            "type" : "boolean"
          },
          "manageFields" : {
            "type" : "boolean"
          },
          "lockPrefix" : {
            "type" : "boolean"
          },
          "manageWorkflow" : {
            "type" : "boolean"
          },
          "editApproved" : {
            "type" : "boolean"
          }
        }
      },
      "MtbApiKeyDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string"
          },
          "applicationName" : {
            "type" : "string"
          },
          "apiKey" : {
            "type" : "string"
          },
          "expiresAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "createdAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "status" : {
            "type" : "string"
          }
        }
      },
      "MtbBreakdownEdgeReadDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "model" : {
            "$ref" : "#/components/schemas/MtbBreakdownModelReadDto"
          }
        }
      },
      "MtbBreakdownModelReadDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "version" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "MtbBreakdownReadDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "symbol" : {
            "$ref" : "#/components/schemas/MtbBreakdownSymbolReadDto"
          },
          "edge" : {
            "$ref" : "#/components/schemas/MtbBreakdownEdgeReadDto"
          }
        }
      },
      "MtbBreakdownSymbolReadDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "version" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "MtbBreakdownWriteDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "symbol" : {
            "type" : "string",
            "format" : "uuid"
          },
          "edge" : {
            "type" : "string",
            "format" : "uuid"
          }
        }
      },
      "IntPoint" : {
        "type" : "object",
        "properties" : {
          "x" : {
            "type" : "integer",
            "format" : "int32"
          },
          "y" : {
            "type" : "integer",
            "format" : "int32"
          }
        },
        "description" : "Polyline points for the edge, in canvas coordinates.",
        "nullable" : true
      },
      "MtbCanvasDto" : {
        "type" : "object",
        "properties" : {
          "workflowState" : {
            "type" : "string",
            "description" : "Workflow state used by model workflow operations.",
            "example" : "EDITABLE",
            "enum" : [ "DRAFT", "NEW", "EDITABLE", "UNDER_REVIEW", "UNDER_APPROVAL", "UNDER_REVISION", "APPROVED", "ARCHIVED" ]
          },
          "vertices" : {
            "type" : "array",
            "description" : "Vertices in the canvas.",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbVertexDto"
            }
          },
          "edges" : {
            "type" : "array",
            "description" : "Edges (relations) in the canvas.",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbEdgeDto"
            }
          },
          "layerZOrder" : {
            "type" : "array",
            "description" : "Layer UUIDs in z-order (rendering order).\nThe list represents the stacking order of layers in bottom-to-top order.\n",
            "example" : [ "2b56b27e-d2b3-4c2f-928a-2331fff28d6b", "79f3610c-d2a1-49cc-97f0-55940f939e5f" ],
            "items" : {
              "type" : "string",
              "description" : "Layer UUIDs in z-order (rendering order).\nThe list represents the stacking order of layers in bottom-to-top order.\n",
              "example" : "[\"2b56b27e-d2b3-4c2f-928a-2331fff28d6b\",\"79f3610c-d2a1-49cc-97f0-55940f939e5f\"]"
            }
          },
          "swimlaneSettings" : {
            "required" : [ "objectType", "relations" ],
            "type" : "object",
            "properties" : {
              "objectType" : {
                "type" : "string",
                "description" : "Object type for which swimlane rules apply (must be valid for the repository/model). Allowed values are enum names from ObjectType.",
                "example" : "ACTIVITY",
                "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
              },
              "relations" : {
                "type" : "array",
                "description" : "Relations used to determine swimlane grouping / direction.",
                "items" : {
                  "$ref" : "#/components/schemas/MtbSwimlaneRelationDto"
                }
              }
            },
            "description" : "Swimlane settings entry for a given object type.\n\nRequired fields:\n- objectType\n- relations\n\nNotes:\n- objectType must be a valid model object type for the repository.\n- relations must be a non-null list (may be empty if you want no relations).\n",
            "nullable" : true
          }
        }
      },
      "MtbColorDto" : {
        "required" : [ "space" ],
        "type" : "object",
        "properties" : {
          "space" : {
            "type" : "string",
            "description" : "Color space. SRGB represents absolute colors and HSB represents relative transforms.",
            "example" : "SRGB",
            "enum" : [ "SRGB", "HSB" ]
          },
          "red" : {
            "maximum" : 255,
            "minimum" : 0,
            "type" : "integer",
            "description" : "SRGB red channel (0-255). Present when space = SRGB.",
            "format" : "int32",
            "example" : 251
          },
          "green" : {
            "maximum" : 255,
            "minimum" : 0,
            "type" : "integer",
            "description" : "SRGB green channel (0-255). Present when space = SRGB.",
            "format" : "int32",
            "example" : 144
          },
          "blue" : {
            "maximum" : 255,
            "minimum" : 0,
            "type" : "integer",
            "description" : "SRGB blue channel (0-255). Present when space = SRGB.",
            "format" : "int32",
            "example" : 10
          },
          "hexRepresentation" : {
            "type" : "string",
            "description" : "Hex color representation (#RRGGBB). Present when space = SRGB.",
            "example" : "#FB900A"
          },
          "transformHue" : {
            "maximum" : 1,
            "minimum" : -1,
            "type" : "number",
            "description" : "HSB hue transform in range [-1.0, 1.0]. Present when space = HSB.",
            "format" : "float",
            "example" : 0.34
          },
          "transformSaturation" : {
            "maximum" : 1,
            "minimum" : -1,
            "type" : "number",
            "description" : "HSB saturation transform in range [-1.0, 1.0]. Present when space = HSB.",
            "format" : "float",
            "example" : -0.07
          },
          "transformBrightness" : {
            "maximum" : 1,
            "minimum" : -1,
            "type" : "number",
            "description" : "HSB brightness transform in range [-1.0, 1.0]. Present when space = HSB.",
            "format" : "float",
            "example" : 0
          }
        },
        "description" : "Color definition.\n\nTwo modes are supported:\n1) SRGB: absolute color using red/green/blue (0-255) and optional hexRepresentation.\n   - Use when space = \"SRGB\".\n   - For strokes/borders, color space is always SRGB.\n\n2) HSB: relative transform applied to the default color(s) of the object type.\n   - Use when space = \"HSB\".\n   - transformHue/transformSaturation/transformBrightness are in range [-1.0, 1.0].\n\nFields not applicable for the selected space may be omitted or null.\n",
        "nullable" : true,
        "example" : {
          "space" : "SRGB",
          "red" : 251,
          "green" : 144,
          "blue" : 10,
          "hexRepresentation" : "#FB900A"
        }
      },
      "MtbEdgeDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "description" : "Edge identifier.\nPATCH /canvas: required to identify the edge to update; not a mutable property.\nPOST /canvas/edges: generated by the server; request values are ignored.\n",
            "format" : "uuid"
          },
          "edgeType" : {
            "type" : "string",
            "description" : "Edge type (e.g. FLOW).",
            "example" : "FLOW"
          },
          "toVertex" : {
            "type" : "string",
            "description" : "Target vertex UUID.\nPOST /canvas/edges: required.\nPATCH /canvas: read-only.\n",
            "format" : "uuid"
          },
          "fromVertex" : {
            "type" : "string",
            "description" : "Source vertex UUID.\nPOST /canvas/edges: required.\nPATCH /canvas: read-only.\n",
            "format" : "uuid"
          },
          "points" : {
            "type" : "array",
            "description" : "Polyline points for the edge, in canvas coordinates.",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/IntPoint"
            }
          },
          "labels" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbLabelDto"
            },
            "description" : "Labels per language.\n\nThe object is keyed by language UUID.\n",
            "nullable" : true
          },
          "router" : {
            "type" : "string",
            "description" : "Router implementation identifier.",
            "example" : "se.conciliate.mt.router.def.router"
          },
          "hideArrow" : {
            "type" : "boolean",
            "description" : "If true, hide arrow head.",
            "example" : false
          },
          "labelTextFont" : {
            "type" : "string",
            "description" : "Label font family.",
            "example" : "Arial"
          },
          "labelTextSize" : {
            "type" : "integer",
            "description" : "Label font size.",
            "format" : "int32",
            "example" : 11
          },
          "labelTextStyle" : {
            "type" : "string",
            "description" : "Label font style.",
            "example" : "PLAIN",
            "enum" : [ "PLAIN", "BOLD", "ITALIC", "BOLD_ITALIC" ]
          },
          "labelTextColor" : {
            "type" : "string",
            "description" : "Label text color as hex RGB.",
            "example" : "#000000"
          },
          "manualLabelColor" : {
            "type" : "boolean",
            "description" : "True if label color was set manually.",
            "example" : false
          },
          "stroke" : {
            "$ref" : "#/components/schemas/MtbStrokeDto"
          },
          "rotateLabel" : {
            "type" : "boolean",
            "description" : "If true, rotate label along the edge.",
            "example" : false
          },
          "breakdowns" : {
            "type" : "array",
            "description" : "Model UUIDs this edge breaks down to.\nWhen provided on POST/PATCH, the list replaces all existing breakdowns; send all desired breakdowns.\nUse an empty array to remove all; omit the field to leave unchanged on PATCH (or no breakdowns on POST).\n",
            "example" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151", "fdc105cf-ab42-49cf-9f48-0a7310a37a9f" ],
            "items" : {
              "type" : "string",
              "description" : "Model UUIDs this edge breaks down to.\nWhen provided on POST/PATCH, the list replaces all existing breakdowns; send all desired breakdowns.\nUse an empty array to remove all; omit the field to leave unchanged on PATCH (or no breakdowns on POST).\n",
              "example" : "[\"cd0c6b2e-6c62-4c45-809c-d43cb4f2b151\",\"fdc105cf-ab42-49cf-9f48-0a7310a37a9f\"]"
            }
          }
        },
        "description" : "An edge (relation) between two vertices.\n\nPATCH /canvas mutability:\n- Writable: uuid (target identifier), labels, points, edgeType, router, hideArrow, labelTextFont, labelTextSize,\n  labelTextStyle, labelTextColor, stroke, rotateLabel, breakdowns.\n- Read-only / rejected on PATCH /canvas: manualLabelColor, toVertex, fromVertex.\n- Breakdown semantics: when breakdowns is provided, it replaces the entire list; send all desired breakdowns.\n  Use an empty array to remove all; omit the field to leave unchanged.\n\nPOST /canvas/edges mutability:\n- Required writable: fromVertex, toVertex, edgeType, labels, points.\n- Optional writable: router, hideArrow, labelTextFont, labelTextSize, labelTextStyle, labelTextColor, manualLabelColor, stroke, rotateLabel, breakdowns.\n- Read-only / ignored on POST /canvas/edges: uuid.\n"
      },
      "MtbLabelDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string",
            "description" : "Rendered title (may contain soft hyphenations).",
            "example" : "Need to be creative"
          },
          "rawTitle" : {
            "type" : "string",
            "description" : "Raw title (original text). Will be null if the title has no soft hyphenations.\n",
            "nullable" : true,
            "example" : "Need to be creative"
          },
          "x" : {
            "type" : "integer",
            "description" : "Label x coordinate in canvas coordinates.",
            "format" : "int32",
            "example" : 191
          },
          "y" : {
            "type" : "integer",
            "description" : "Label y coordinate in canvas coordinates.",
            "format" : "int32",
            "example" : 317
          },
          "width" : {
            "type" : "integer",
            "description" : "Label width.",
            "format" : "int32",
            "example" : 54
          },
          "height" : {
            "type" : "integer",
            "description" : "Label height.",
            "format" : "int32",
            "example" : 28
          },
          "translated" : {
            "type" : "boolean",
            "description" : "Translation flag.\nThe language entry without 'translated' is the default language.\n",
            "example" : false
          }
        },
        "description" : "A localized label entry (text + placement)."
      },
      "MtbStrokeDto" : {
        "type" : "object",
        "properties" : {
          "dashPattern" : {
            "type" : "array",
            "description" : "Dash pattern array. Null means solid line.",
            "nullable" : true,
            "example" : [ 1.0, 2.0 ],
            "items" : {
              "type" : "number",
              "description" : "Dash pattern array. Null means solid line.",
              "format" : "float",
              "nullable" : true
            }
          },
          "width" : {
            "type" : "number",
            "description" : "Line width.",
            "format" : "float",
            "example" : 1.75
          },
          "color" : {
            "$ref" : "#/components/schemas/MtbColorDto"
          }
        },
        "description" : "Stroke style definition used for borders and edges.",
        "nullable" : true
      },
      "MtbSwimlaneRelationDto" : {
        "required" : [ "direction", "edgeType", "objectType" ],
        "type" : "object",
        "properties" : {
          "objectType" : {
            "type" : "string",
            "description" : "Related object type (must be valid for the repository/model). Allowed values are enum names from ObjectType.",
            "example" : "REQUIREMENT",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "edgeType" : {
            "type" : "string",
            "description" : "Edge type connecting objects (must be valid for the repository). Allowed values are enum names from CoreEdgeType.",
            "example" : "ADRESSES",
            "enum" : [ "CONSISTS_OF", "PERFORMS", "IS_A_KIND_OF", "RACI_RESPONSIBLE", "RACI_ACCOUNTABLE", "RACI_CONSULTANT", "RACI_INFORMED", "IS_A_PART_OF", "CORRESPONDS_WITH", "SECONDARY_FLOW", "ADRESSES", "IS_SITUATED_AT", "HANDLES", "IS_SPECIALISED_IN", "DEFINES", "INTERRELATES_WITH", "BELONGS_TO", "VERIFICATION_FLOW", "CAN_PLAY", "IS_FOLLOWED_BY", "FLOW", "IS_USED_BY", "CONTROLS", "IS_EMPOWERED", "SUPPORTS", "REQUIRES", "REALIZE", "BPMN_ASSOCIATION", "BPMN_MESSAGE_FLOW", "BPMN_SEQUENCE_FLOW", "CONCEPT_RELATION_TO", "MANY_TO_MANY", "ONE_TO_MANY", "ONE_TO_ONE", "TRIGGER" ]
          },
          "direction" : {
            "type" : "string",
            "description" : "Traversal direction.",
            "example" : "FORWARD",
            "enum" : [ "FORWARD", "REVERSED" ]
          }
        },
        "description" : "Swimlane relation rule.\n\nRequired fields:\n- objectType\n- edgeType\n- direction\n\nNotes:\n- objectType must be a valid model object type for the repository.\n- edgeType must be a valid relation type for the repository.\n- direction controls traversal direction when evaluating relations.\n"
      },
      "MtbSwimlaneSettingsDto" : {
        "required" : [ "objectType", "relations" ],
        "type" : "object",
        "properties" : {
          "objectType" : {
            "type" : "string",
            "description" : "Object type for which swimlane rules apply (must be valid for the repository/model). Allowed values are enum names from ObjectType.",
            "example" : "ACTIVITY",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "relations" : {
            "type" : "array",
            "description" : "Relations used to determine swimlane grouping / direction.",
            "items" : {
              "$ref" : "#/components/schemas/MtbSwimlaneRelationDto"
            }
          }
        },
        "description" : "Swimlane settings entry for a given object type.\n\nRequired fields:\n- objectType\n- relations\n\nNotes:\n- objectType must be a valid model object type for the repository.\n- relations must be a non-null list (may be empty if you want no relations).\n"
      },
      "MtbVertexDescriptionDto" : {
        "type" : "object",
        "properties" : {
          "description" : {
            "type" : "string",
            "description" : "Localized description text.",
            "example" : "My Description"
          }
        },
        "description" : "Per-language vertex description entry."
      },
      "MtbVertexDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "description" : "Vertex identifier.\nPATCH /canvas: required to identify the vertex to update; not a mutable property.\nPOST /canvas/vertices: generated by the server; request values are ignored.\n",
            "format" : "uuid"
          },
          "x" : {
            "type" : "integer",
            "description" : "X coordinate (canvas coordinate system).",
            "format" : "int32",
            "example" : 209
          },
          "y" : {
            "type" : "integer",
            "description" : "Y coordinate (canvas coordinate system).",
            "format" : "int32",
            "example" : 296
          },
          "width" : {
            "type" : "integer",
            "description" : "Vertex width.",
            "format" : "int32",
            "example" : 18
          },
          "height" : {
            "type" : "integer",
            "description" : "Vertex height.",
            "format" : "int32",
            "example" : 18
          },
          "accessLevel" : {
            "type" : "string",
            "description" : "  Effective access level for the current user.\n\n  Allowed values:\n  - READ: read-only access\n  - WRITE: editable access\n  - NONE: restricted view; only basic geometry fields are returned\n",
            "nullable" : true,
            "example" : "WRITE",
            "enum" : [ "READ", "WRITE", "NONE" ]
          },
          "versionLocked" : {
            "type" : "boolean",
            "description" : "True if the symbol is version-locked (cannot be modified in the current workflow state)."
          },
          "sizeRatio" : {
            "type" : "number",
            "description" : "Width/height ratio used when lockProportions is true.",
            "format" : "float",
            "example" : 1.3333
          },
          "lockProportions" : {
            "type" : "boolean",
            "description" : "If true, the vertex maintains aspect ratio when resized.",
            "example" : false
          },
          "labels" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbLabelDto"
            },
            "description" : "Labels per language.\n\nThe object is keyed by language UUID.\nEach value contains label text and placement.\nThe language entry without 'translated' is the default language.\n\nWhen centerLabel=true and the vertex is smaller than 65 x 20 pixels, the label bounds\nmust be horizontally centered and positioned exactly 3 pixels above or below the vertex.\n"
          },
          "descriptions" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbVertexDescriptionDto"
            },
            "description" : "Descriptions per language (only for objectTypes 'TEXT' and 'WEB_COMPONENT').\n\nThe object is keyed by language UUID.\n"
          },
          "centerLabel" : {
            "type" : "boolean",
            "description" : "If true, the label is centered on the vertex. For vertices smaller than 65 x 20 pixels, the label is centered horizontally and placed above or below the vertex with an exact 3 pixel gap. When label bounds are supplied with centerLabel=true, they must follow this positioning rule."
          },
          "labelTextFont" : {
            "type" : "string",
            "description" : "Label font family.",
            "example" : "Arial"
          },
          "labelTextSize" : {
            "type" : "integer",
            "description" : "Label font size.",
            "format" : "int32",
            "example" : 11
          },
          "labelTextStyle" : {
            "type" : "string",
            "description" : "Label font style.",
            "example" : "PLAIN",
            "enum" : [ "PLAIN", "BOLD", "ITALIC", "BOLD_ITALIC" ]
          },
          "labelTextColor" : {
            "type" : "string",
            "description" : "Label text color as hex RGB.",
            "example" : "#000000"
          },
          "manualLabelColor" : {
            "type" : "boolean",
            "description" : "True if label color was set manually (not from profile/theme).",
            "example" : false
          },
          "showLabel" : {
            "type" : "boolean",
            "description" : "If true, label is visible.",
            "example" : true
          },
          "image" : {
            "type" : "string",
            "description" : "Image URL; null means no image.",
            "nullable" : true,
            "example" : "null"
          },
          "border" : {
            "$ref" : "#/components/schemas/MtbStrokeDto"
          },
          "color" : {
            "$ref" : "#/components/schemas/MtbColorDto"
          },
          "manualColor" : {
            "type" : "boolean",
            "description" : "True if the color was set manually; false if it comes from a color profile.",
            "example" : false
          },
          "locked" : {
            "type" : "boolean",
            "description" : "If true, the vertex is locked.",
            "example" : false
          },
          "layer" : {
            "type" : "string",
            "description" : "Layer UUID; null means background layer.",
            "format" : "uuid",
            "nullable" : true
          },
          "holder" : {
            "type" : "boolean",
            "description" : "True if the vertex is a holder.",
            "example" : false
          },
          "owningDataObject" : {
            "type" : "boolean",
            "description" : "True if the vertex owns the underlying symbol.",
            "example" : true
          },
          "breakdowns" : {
            "type" : "array",
            "description" : "Model UUIDs the symbol of this vertex breaks down to.\nWhen provided on POST/PATCH, the list replaces all existing breakdowns; send all desired breakdowns.\nUse an empty array to remove all; omit the field to leave unchanged on PATCH (or no breakdowns on POST).\n",
            "example" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151", "fdc105cf-ab42-49cf-9f48-0a7310a37a9f" ],
            "items" : {
              "type" : "string",
              "description" : "Model UUIDs the symbol of this vertex breaks down to.\nWhen provided on POST/PATCH, the list replaces all existing breakdowns; send all desired breakdowns.\nUse an empty array to remove all; omit the field to leave unchanged on PATCH (or no breakdowns on POST).\n",
              "example" : "[\"cd0c6b2e-6c62-4c45-809c-d43cb4f2b151\",\"fdc105cf-ab42-49cf-9f48-0a7310a37a9f\"]"
            }
          },
          "hasInformation" : {
            "type" : "boolean",
            "description" : "True iff objectType is not TEXT and either:\n- at least one document is attached, or\n- at least one non-empty rich-text attribute exists.\n",
            "example" : false
          },
          "hasDocument" : {
            "type" : "boolean",
            "description" : "True if the symbol has at least one document attached.",
            "example" : false
          },
          "symbol" : {
            "type" : "string",
            "description" : "Symbol UUID.\nPOST /canvas/vertices: required.\nPATCH /canvas: read-only.\n",
            "format" : "uuid"
          },
          "objectType" : {
            "type" : "string",
            "description" : "Symbol object type.",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "prefix" : {
            "type" : "string",
            "description" : "Optional title prefix; null means no prefix.",
            "nullable" : true
          },
          "alternativeSymbol" : {
            "type" : "string",
            "description" : "Optional alternative symbol type (if supported by configuration).",
            "nullable" : true,
            "enum" : [ "AND", "OR", "FIGURE_TORSO", "FIGURE_FULL", "MAN", "WOMAN", "UNISEX", "GAUGE" ]
          },
          "properties" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "object",
              "additionalProperties" : {
                "type" : "string",
                "description" : "Vendor-/plugin-specific vertex properties.\n\nJSON structure:\n- Top-level object keys are namespaces or plugin ids (string).\n- Each namespace/plugin id maps to a string-to-string dictionary of properties.\n\nDeletion semantics for PATCH:\n- properties = null removes all properties.\n- { \"providerId\": null } removes all properties for that provider.\n- { \"providerId\": { \"key\": null } } removes the single property with that key.\n\nValues are strings; some values may themselves contain serialized JSON/arrays depending on plugin.\n",
                "nullable" : true,
                "example" : "{\"se.conciliate.swimlane\":{\"swimlane\":\"true\",\"swimlane.orientation\":\"auto\",\"swimlane.reversed\":\"['INDIVIDUAL']\",\"swimlane.settings\":\"{'INDIVIDUAL':'CAN_PLAY'}\",\"swimlane.textAlignment\":\"LEFT\"},\"partner_plugin_id\":{\"PartnerProperty\":\"PartnerValue\"}}"
              },
              "description" : "Vendor-/plugin-specific vertex properties.\n\nJSON structure:\n- Top-level object keys are namespaces or plugin ids (string).\n- Each namespace/plugin id maps to a string-to-string dictionary of properties.\n\nDeletion semantics for PATCH:\n- properties = null removes all properties.\n- { \"providerId\": null } removes all properties for that provider.\n- { \"providerId\": { \"key\": null } } removes the single property with that key.\n\nValues are strings; some values may themselves contain serialized JSON/arrays depending on plugin.\n",
              "nullable" : true,
              "example" : {
                "se.conciliate.swimlane" : {
                  "swimlane" : "true",
                  "swimlane.orientation" : "auto",
                  "swimlane.reversed" : "['INDIVIDUAL']",
                  "swimlane.settings" : "{'INDIVIDUAL':'CAN_PLAY'}",
                  "swimlane.textAlignment" : "LEFT"
                },
                "partner_plugin_id" : {
                  "PartnerProperty" : "PartnerValue"
                }
              }
            },
            "description" : "Vendor-/plugin-specific vertex properties.\n\nJSON structure:\n- Top-level object keys are namespaces or plugin ids (string).\n- Each namespace/plugin id maps to a string-to-string dictionary of properties.\n\nDeletion semantics for PATCH:\n- properties = null removes all properties.\n- { \"providerId\": null } removes all properties for that provider.\n- { \"providerId\": { \"key\": null } } removes the single property with that key.\n\nValues are strings; some values may themselves contain serialized JSON/arrays depending on plugin.\n",
            "nullable" : true,
            "example" : {
              "se.conciliate.swimlane" : {
                "swimlane" : "true",
                "swimlane.orientation" : "auto",
                "swimlane.reversed" : "['INDIVIDUAL']",
                "swimlane.settings" : "{'INDIVIDUAL':'CAN_PLAY'}",
                "swimlane.textAlignment" : "LEFT"
              },
              "partner_plugin_id" : {
                "PartnerProperty" : "PartnerValue"
              }
            }
          },
          "zOrder" : {
            "type" : "integer",
            "description" : "Z-order for rendering among vertices within the same layer.",
            "format" : "int32",
            "example" : 0
          }
        },
        "description" : "A vertex on the canvas. A vertex is the visual representation of a symbol in a specific model.\n\nConditional fields:\n- If accessLevel = NONE, only uuid, accessLevel, x, y, width, height and zOrder are included.\n- If accessLevel is READ or WRITE, additional fields will be present.\n\nPATCH /canvas mutability:\n- Writable: uuid (target identifier), x, y, width, height, zOrder, lockProportions, labels (bounds only: x/y/width/height),\n  centerLabel, labelTextFont, labelTextSize, labelTextStyle, labelTextColor, showLabel, image, border, color, locked, layer,\n  sizeRatio, breakdowns,\n  holder, owningDataObject, properties.\n- Read-only / rejected on PATCH /canvas: accessLevel, versionLocked, descriptions, manualLabelColor, manualColor,\n  hasInformation, hasDocument, symbol, objectType, prefix, alternativeSymbol.\n- Breakdown semantics: when breakdowns is provided, it replaces the entire list; send all desired breakdowns.\n  Use an empty array to remove all; omit the field to leave unchanged.\n\nPOST /canvas/vertices mutability:\n- Required writable: symbol, x, y, width, height.\n- Optional writable: zOrder, lockProportions, labels (bounds only: x/y/width/height), centerLabel, labelTextFont, labelTextSize,\n  labelTextStyle, labelTextColor, showLabel, image, border, color, locked, layer, holder, owningDataObject, properties, breakdowns.\n- Read-only / rejected on POST /canvas/vertices: uuid, accessLevel, versionLocked, sizeRatio, descriptions, manualLabelColor,\n  manualColor, hasInformation, hasDocument, objectType, prefix, alternativeSymbol.\n"
      },
      "MtbDescriptionTypeDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbDescriptionTypeTitleDto"
            }
          },
          "dataType" : {
            "type" : "string"
          },
          "inputType" : {
            "type" : "string"
          },
          "icon" : {
            "type" : "string"
          },
          "connectedTo" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbDescriptionTypeEntryDto"
            }
          }
        }
      },
      "MtbDescriptionTypeEntryDto" : {
        "type" : "object",
        "properties" : {
          "position" : {
            "type" : "integer",
            "format" : "int32"
          },
          "hidden" : {
            "type" : "string"
          },
          "type" : {
            "type" : "string"
          }
        }
      },
      "MtbDescriptionTypeTitleDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string"
          },
          "translated" : {
            "type" : "boolean"
          },
          "summary" : {
            "type" : "string"
          },
          "refinement" : {
            "type" : "string"
          }
        }
      },
      "MtbDirectoryDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string"
          },
          "title" : {
            "type" : "string"
          },
          "parent" : {
            "type" : "string"
          }
        }
      },
      "MtbDocumentRootDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbTitleDto"
            }
          },
          "type" : {
            "type" : "string"
          },
          "key" : {
            "type" : "string"
          },
          "value" : {
            "type" : "string"
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time"
          },
          "historyEdited" : {
            "type" : "boolean"
          }
        }
      },
      "MtbDocumentTypeDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "repositoryId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time"
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbDocumentTypeLanguageDto"
            }
          }
        }
      },
      "MtbDocumentTypeLanguageDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "title" : {
            "type" : "string"
          },
          "documentTypeUuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "languageUuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "translated" : {
            "type" : "boolean"
          }
        }
      },
      "MtbResolveDocumentDto" : {
        "type" : "object",
        "properties" : {
          "language" : {
            "type" : "string",
            "format" : "uuid"
          },
          "documentKeys" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        }
      },
      "MtbDraftCreateDto" : {
        "type" : "object",
        "properties" : {
          "modelType" : {
            "type" : "string",
            "description" : "Model type for the model.",
            "example" : "GENERAL_MODEL"
          },
          "alternativeId" : {
            "type" : "string",
            "description" : "Optional alternative ID for the model.",
            "nullable" : true
          },
          "prefix" : {
            "type" : "string",
            "description" : "Optional model prefix.",
            "nullable" : true
          },
          "prefixLocked" : {
            "type" : "boolean",
            "description" : "Whether the model prefix should be locked.",
            "nullable" : true,
            "example" : false
          },
          "documents" : {
            "type" : "array",
            "description" : "Optional list of linked documents.",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbDocumentIdDto"
            }
          },
          "owner" : {
            "type" : "string",
            "description" : "Optional owner UUID. Requires admin access.",
            "nullable" : true
          },
          "group" : {
            "type" : "string",
            "description" : "Optional customer-group UUID used as the permission-group selector. If omitted on POST, the `2c8-Permission-Group` header fallback is used. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group."
          },
          "notify" : {
            "type" : "boolean",
            "description" : "Whether notifications should be enabled for the created model.",
            "nullable" : true,
            "example" : false
          },
          "ownerRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "ownerWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "groupRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "groupWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "allRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "allWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : false
          },
          "subscribers" : {
            "type" : "array",
            "description" : "Optional subscriber UUIDs to attach to the created model.",
            "items" : {
              "type" : "string"
            }
          },
          "title" : {
            "type" : "string",
            "description" : "Title for the draft model. It will be stored using the draft repository default language.",
            "example" : "Draft model"
          },
          "translated" : {
            "type" : "boolean",
            "description" : "Optional translated flag for the draft title.",
            "nullable" : true,
            "example" : false
          }
        },
        "description" : "Request payload used when creating a model in the draft/Lite repository.\nThe provided title is stored under the draft repository default language, so no language UUID is required.\n"
      },
      "MtbInstalledPluginDto" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "version" : {
            "$ref" : "#/components/schemas/MtbPluginVersionDto"
          },
          "minApiVersion" : {
            "$ref" : "#/components/schemas/MtbPluginApiVersionDto"
          },
          "maxApiVersionExclusive" : {
            "$ref" : "#/components/schemas/MtbPluginApiVersionDto"
          },
          "data" : {
            "type" : "string",
            "format" : "byte"
          },
          "autoUpgrade" : {
            "type" : "boolean"
          },
          "repoRestricted" : {
            "type" : "boolean"
          },
          "userRestricted" : {
            "type" : "boolean"
          },
          "logo" : {
            "type" : "string",
            "nullable" : true
          },
          "targetVersion" : {
            "type" : "string",
            "nullable" : true
          },
          "installedUsers" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "repositories" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "clientCompatible" : {
            "type" : "boolean"
          },
          "serverCompatible" : {
            "type" : "boolean"
          }
        }
      },
      "MtbPluginApiVersionDto" : {
        "type" : "object",
        "properties" : {
          "major" : {
            "type" : "integer",
            "format" : "int32"
          },
          "minor" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "MtbPluginVersionDto" : {
        "type" : "object",
        "properties" : {
          "first" : {
            "type" : "integer",
            "format" : "int32"
          },
          "second" : {
            "type" : "integer",
            "format" : "int32"
          },
          "third" : {
            "type" : "integer",
            "format" : "int32"
          },
          "fourth" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "MtbLanguageDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string"
          },
          "name" : {
            "type" : "string"
          },
          "icon" : {
            "type" : "string"
          },
          "iso" : {
            "type" : "string"
          },
          "defaultLanguage" : {
            "type" : "boolean"
          },
          "hyphenationDictionary" : {
            "type" : "string"
          },
          "copyFromLanguageUuid" : {
            "type" : "string"
          }
        }
      },
      "MtbLayerTypeDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "modelType" : {
            "type" : "string"
          },
          "objectTypes" : {
            "type" : "string"
          },
          "repositoryID" : {
            "type" : "integer",
            "format" : "int64"
          },
          "ikon" : {
            "type" : "string"
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbTitleDto"
            }
          },
          "zorder" : {
            "type" : "integer",
            "format" : "int32"
          },
          "zOrder" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "MtbLayerDto" : {
        "required" : [ "layerType" ],
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "layerType" : {
            "type" : "string",
            "format" : "uuid"
          }
        }
      },
      "MtbListResultColumnDto" : {
        "type" : "object",
        "properties" : {
          "values" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "documents" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbDocumentIdDto"
            }
          }
        }
      },
      "MtbListResultColumnHeaderDto" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "separator" : {
            "type" : "string"
          }
        }
      },
      "MtbListResultContextDto" : {
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string",
            "enum" : [ "MODEL", "SYMBOL" ]
          },
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "webId" : {
            "type" : "string"
          },
          "title" : {
            "type" : "string"
          },
          "icon" : {
            "type" : "string"
          },
          "prefix" : {
            "type" : "string"
          }
        }
      },
      "MtbListResultDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string"
          },
          "resultType" : {
            "type" : "string",
            "enum" : [ "ATTRIBUTE_TYPE", "COLOR_SCHEME", "DOCUMENT", "DOCUMENT_TYPE", "ENTITY_PROPERTY", "IMAGE", "LAYER_TYPE", "LIST", "MODEL", "PLUGIN_DATA", "PUBLISH_PROFILE", "SUBSCRIBER", "SYMBOL", "TIMESTAMP", "USER", "VARIABLE" ]
          },
          "rows" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbListResultRowDto"
            }
          },
          "columns" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbListResultColumnHeaderDto"
            }
          }
        }
      },
      "MtbListResultRowDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "documentId" : {
            "$ref" : "#/components/schemas/MtbDocumentIdDto"
          },
          "webId" : {
            "type" : "string"
          },
          "prefix" : {
            "type" : "string"
          },
          "icon" : {
            "type" : "string"
          },
          "contexts" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbListResultContextDto"
            }
          },
          "columns" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbListResultColumnDto"
            }
          }
        }
      },
      "MtbExecuteListDto" : {
        "type" : "object",
        "properties" : {
          "queryXML" : {
            "type" : "string"
          },
          "language" : {
            "type" : "string",
            "format" : "uuid"
          },
          "columns" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "approvedVersions" : {
            "type" : "boolean"
          },
          "includeInitialVersions" : {
            "type" : "boolean"
          },
          "overrideResultContext" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "MODEL", "SYMBOL" ]
            }
          },
          "modelContext" : {
            "type" : "integer",
            "format" : "int64"
          },
          "filterOnModel" : {
            "type" : "string",
            "format" : "uuid"
          }
        }
      },
      "MtbListDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "queryXml" : {
            "type" : "string"
          },
          "columns" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbTitleDto"
            }
          },
          "resultType" : {
            "type" : "string",
            "enum" : [ "MODEL", "SYMBOL", "DOCUMENT", "UNKNOWN" ]
          }
        }
      },
      "MtbDocumentDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "languages" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbLanguageContentDto"
            }
          },
          "type" : {
            "type" : "string"
          },
          "documentTypes" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "format" : "uuid"
            }
          },
          "prefix" : {
            "type" : "string"
          },
          "icon" : {
            "type" : "string"
          },
          "copyOnPublish" : {
            "type" : "boolean"
          },
          "showInPanel" : {
            "type" : "boolean"
          },
          "responsible" : {
            "type" : "string",
            "format" : "uuid"
          },
          "owner" : {
            "type" : "string",
            "format" : "uuid"
          },
          "group" : {
            "type" : "string",
            "description" : "Optional customer-group UUID used as the permission-group selector. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group.",
            "format" : "uuid"
          },
          "prefix_locked" : {
            "type" : "boolean"
          }
        }
      },
      "MtbLanguageContentDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string"
          },
          "content" : {
            "type" : "string"
          },
          "translated" : {
            "type" : "boolean"
          }
        }
      },
      "MtbMatrixDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "hideEmpty" : {
            "type" : "boolean"
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "string"
            }
          },
          "relations" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbMatrixRelationDto"
            }
          },
          "xqueryGrouping" : {
            "type" : "string",
            "enum" : [ "NONE", "MODEL", "FILTER_BY_MODEL" ]
          },
          "yqueryGrouping" : {
            "type" : "string",
            "enum" : [ "NONE", "MODEL", "FILTER_BY_MODEL" ]
          },
          "xlist" : {
            "type" : "string",
            "format" : "uuid"
          },
          "ylist" : {
            "type" : "string",
            "format" : "uuid"
          },
          "xcolors" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "ycolors" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        }
      },
      "MtbMatrixRelationDto" : {
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string",
            "enum" : [ "PARTICIPATES_IN", "RELATIONS", "CUSTOM_RELATIONS", "CONNECTED_TO", "MAINTAINER", "REVIEWER", "APPROVER" ]
          },
          "defaultIcon" : {
            "type" : "boolean"
          },
          "iconURLByLanguage" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "string"
            }
          },
          "list" : {
            "type" : "string",
            "format" : "uuid"
          },
          "edgeType" : {
            "type" : "string"
          }
        }
      },
      "MtbMatrixHeaderDto" : {
        "type" : "object",
        "properties" : {
          "documentId" : {
            "$ref" : "#/components/schemas/MtbDocumentIdDto"
          },
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "webId" : {
            "type" : "string"
          },
          "title" : {
            "type" : "string"
          },
          "icon" : {
            "type" : "string"
          },
          "prefix" : {
            "type" : "string"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "ATTRIBUTE_TYPE", "COLOR_SCHEME", "DOCUMENT", "DOCUMENT_TYPE", "ENTITY_PROPERTY", "IMAGE", "LAYER_TYPE", "LIST", "MODEL", "PLUGIN_DATA", "PUBLISH_PROFILE", "SUBSCRIBER", "SYMBOL", "TIMESTAMP", "USER", "VARIABLE" ]
          }
        }
      },
      "MtbMatrixResultDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string"
          },
          "errorMessage" : {
            "type" : "string",
            "enum" : [ "INVALID_X_LIST", "INVALID_Y_LIST", "MATRIX_TO_LARGE", "MATRIX_EMPTY" ]
          },
          "cells" : {
            "type" : "array",
            "items" : {
              "type" : "array",
              "items" : {
                "type" : "array",
                "items" : {
                  "type" : "integer",
                  "format" : "int32"
                }
              }
            }
          },
          "icons" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "xqueryGrouping" : {
            "type" : "string",
            "enum" : [ "NONE", "MODEL", "FILTER_BY_MODEL" ]
          },
          "yqueryGrouping" : {
            "type" : "string",
            "enum" : [ "NONE", "MODEL", "FILTER_BY_MODEL" ]
          },
          "xlist" : {
            "type" : "array",
            "items" : {
              "type" : "array",
              "items" : {
                "$ref" : "#/components/schemas/MtbMatrixHeaderDto"
              }
            }
          },
          "ylist" : {
            "type" : "array",
            "items" : {
              "type" : "array",
              "items" : {
                "$ref" : "#/components/schemas/MtbMatrixHeaderDto"
              }
            }
          },
          "xcolors" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "ycolors" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        }
      },
      "MtbExecuteMatrixDto" : {
        "type" : "object",
        "properties" : {
          "language" : {
            "type" : "string",
            "format" : "uuid"
          },
          "lockedRevisions" : {
            "type" : "boolean"
          },
          "includeInitialRevisions" : {
            "type" : "boolean"
          },
          "modelContext" : {
            "type" : "integer",
            "format" : "int64"
          },
          "filterOnModel" : {
            "type" : "string",
            "format" : "uuid"
          }
        }
      },
      "MtbModelContextDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "repository" : {
            "type" : "string",
            "format" : "uuid"
          },
          "models" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbModelVersionDto"
            }
          }
        }
      },
      "MtbModelVersionDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "version" : {
            "type" : "string"
          }
        }
      },
      "MtbContentDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string"
          },
          "translated" : {
            "type" : "boolean"
          },
          "text" : {
            "type" : "string"
          }
        }
      },
      "MtbDescriptionDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "descriptionType" : {
            "type" : "string",
            "format" : "uuid"
          },
          "content" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbContentDto"
            }
          }
        }
      },
      "MtbPluginDataDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "plugin" : {
            "type" : "string"
          },
          "key" : {
            "type" : "string"
          },
          "content" : {
            "type" : "string",
            "nullable" : true
          },
          "textContent" : {
            "type" : "string",
            "nullable" : true
          },
          "root" : {
            "type" : "boolean"
          }
        }
      },
      "MtbPluginRelationDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "target" : {
            "type" : "string",
            "format" : "uuid"
          },
          "relationType" : {
            "type" : "string"
          },
          "position" : {
            "type" : "integer",
            "format" : "int32"
          },
          "strong" : {
            "type" : "boolean"
          }
        }
      },
      "MtbSubscriberDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "userUuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "email" : {
            "type" : "string"
          },
          "firstName" : {
            "type" : "string"
          },
          "lastName" : {
            "type" : "string"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "ALL", "USER", "EMAIL", "GROUP" ]
          },
          "name" : {
            "type" : "string"
          }
        }
      },
      "MtbModelVersionChangeDto" : {
        "type" : "object",
        "properties" : {
          "message" : {
            "type" : "string",
            "description" : "Optional log message.\n\nPOST:\n- stored on the initial revision-log entry for the new version\n\nPATCH:\n- appends a log entry on the current latest version\n- can be combined with workflowState in the same request\n",
            "example" : "Ready for review"
          },
          "workflowState" : {
            "type" : "string",
            "description" : "Workflow state used by model workflow operations.",
            "example" : "UNDER_REVIEW",
            "enum" : [ "DRAFT", "NEW", "EDITABLE", "UNDER_REVIEW", "UNDER_APPROVAL", "UNDER_REVISION", "APPROVED", "ARCHIVED" ]
          }
        },
        "description" : "Request payload used by the model-version create and update endpoints.\n\nPOST /versions:\n- message is optional\n- workflowState must be omitted\n\nPATCH /versions:\n- provide message and/or workflowState\n- at least one of the two fields must be provided\n"
      },
      "MtbNotificationsDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "publication" : {
            "type" : "string",
            "format" : "uuid"
          },
          "workflowState" : {
            "type" : "string"
          },
          "publishDate" : {
            "type" : "string"
          }
        }
      },
      "ApiErrorDto" : {
        "type" : "object",
        "properties" : {
          "message" : {
            "type" : "string"
          },
          "timestamp" : {
            "type" : "string",
            "format" : "date-time"
          }
        }
      },
      "MtbGroupDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "name" : {
            "type" : "string"
          }
        }
      },
      "MtbPermissionGroupDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "group" : {
            "$ref" : "#/components/schemas/MtbGroupDto"
          },
          "permissions" : {
            "$ref" : "#/components/schemas/MtbPermissionsDto"
          }
        }
      },
      "MtbPermissionsDto" : {
        "type" : "object",
        "properties" : {
          "ownerRead" : {
            "type" : "boolean"
          },
          "ownerWrite" : {
            "type" : "boolean"
          },
          "groupRead" : {
            "type" : "boolean"
          },
          "groupWrite" : {
            "type" : "boolean"
          },
          "allRead" : {
            "type" : "boolean"
          },
          "allWrite" : {
            "type" : "boolean"
          }
        }
      },
      "MtbQueryResultDto" : {
        "type" : "object",
        "properties" : {
          "ids" : {
            "type" : "array",
            "items" : {
              "type" : "integer",
              "format" : "int64"
            }
          },
          "documentIds" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbDocumentIdDto"
            }
          },
          "contexts" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "array",
              "items" : {
                "type" : "integer",
                "format" : "int64"
              }
            }
          }
        }
      },
      "MtbExecuteQueryDto" : {
        "type" : "object",
        "properties" : {
          "queryXML" : {
            "type" : "string"
          },
          "language" : {
            "type" : "string",
            "format" : "uuid"
          },
          "approvedVersions" : {
            "type" : "boolean"
          },
          "includeInitialVersions" : {
            "type" : "boolean"
          },
          "modelContext" : {
            "type" : "integer",
            "format" : "int64"
          },
          "overrideResultContext" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "MODEL", "SYMBOL" ]
            }
          }
        }
      },
      "MtbCustomRelationDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbTitleDto"
            }
          },
          "actionObject" : {
            "type" : "string"
          },
          "uiGenerated" : {
            "type" : "boolean"
          },
          "historyEdited" : {
            "type" : "boolean"
          },
          "historyPath" : {
            "type" : "string"
          },
          "language" : {
            "type" : "string",
            "format" : "uuid"
          },
          "title" : {
            "type" : "string"
          },
          "modelContext" : {
            "type" : "integer",
            "format" : "int64"
          },
          "sourceObject" : {
            "type" : "string",
            "format" : "uuid"
          },
          "script" : {
            "type" : "string"
          },
          "compilable" : {
            "type" : "boolean"
          },
          "resultType" : {
            "type" : "string"
          },
          "approvedVersions" : {
            "type" : "boolean"
          },
          "columns" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          },
          "result" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbCustomRelationResultDto"
            }
          }
        }
      },
      "MtbCustomRelationResultDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string"
          },
          "webId" : {
            "type" : "string"
          },
          "documentId" : {
            "$ref" : "#/components/schemas/MtbDocumentIdDto"
          },
          "type" : {
            "type" : "string"
          },
          "variant" : {
            "type" : "string"
          },
          "prefix" : {
            "type" : "string"
          },
          "owningModelUUID" : {
            "type" : "string"
          },
          "title" : {
            "type" : "string"
          },
          "rawTitle" : {
            "type" : "string"
          },
          "icon" : {
            "type" : "string"
          }
        }
      },
      "MtbLiveLanguageDto" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64"
          },
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "name" : {
            "type" : "string"
          },
          "locale" : {
            "type" : "string",
            "enum" : [ "am_ET", "ar_AE", "ar_BH", "ar_DJ", "ar_DZ", "ar_EG", "ar_ER", "ar_IQ", "ar_JO", "ar_KW", "ar_LB", "ar_LY", "ar_MA", "ar_MR", "ar_OM", "ar_QU", "ar_SA", "ar_SD", "ar_SY", "ar_TN", "ar_YE", "az_AZ", "be_BY", "bg_BG", "bi_VU", "bn_BD", "bo_CN", "bs_BA", "ca_AD", "cs_CZ", "cy_GB", "da_DK", "de_AT", "de_CH", "de_DE", "de_LI", "de_LU", "dv_MV", "dz_BT", "el_CY", "el_GR", "en_AG", "en_AI", "en_AU", "en_BB", "en_BM", "en_BS", "en_BW", "en_BZ", "en_CA", "en_CK", "en_DM", "en_FJ", "en_FK", "en_FM", "en_GB", "en_GG", "en_GH", "en_GI", "en_GM", "en_GQ", "en_GS", "en_GU", "en_GY", "en_IE", "en_IM", "en_IO", "en_JE", "en_JM", "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_MP", "en_MS", "en_MU", "en_MW", "en_NA", "en_NF", "en_NG", "en_NR", "en_NZ", "en_PG", "en_PN", "en_PW", "en_QU", "en_SB", "en_SC", "en_SG", "en_SH", "en_SL", "en_SZ", "en_TC", "en_TT", "en_UG", "en_US", "en_VC", "en_VG", "en_GD", "en_ZA", "en_ZM", "en_ZW", "es_EC", "es_AR", "es_BO", "es_CL", "es_CO", "es_CR", "es_CU", "es_DO", "es_ES", "es_GT", "es_HN", "es_KM", "es_MX", "es_NI", "es_PA", "es_PE", "es_PR", "es_PY", "es_SV", "es_UY", "es_VE", "et_EE", "fa_AF", "fa_IR", "fi_FI", "fo_FO", "fr_BF", "fr_CD", "fr_CG", "fr_CI", "fr_CM", "fr_BJ", "fr_FR", "fr_GA", "fr_GN", "fr_MC", "fr_ML", "fr_MQ", "fr_NE", "fr_PF", "fr_PM", "fr_SN", "fr_TD", "fr_TG", "fr_WF", "he_IL", "hi_IN", "hr_HR", "ht_HT", "hu_HU", "hy_AM", "id_ID", "is_IS", "it_IT", "it_SM", "it_VA", "ja_JP", "ka_GE", "kk_KZ", "kl_GL", "km_KH", "ko_KP", "ko_KR", "ky_KG", "lo_LA", "lt_LT", "lv_LV", "mg_MG", "mh_MH", "mk_MK", "mn_MN", "ms_BN", "ms_MY", "mt_MT", "my_MM", "ne_NP", "niu_NU", "nl_AN", "nl_AW", "nl_BE", "nl_NL", "nl_SR", "no_NO", "pl_PL", "pt_AO", "pt_BR", "pt_CV", "pt_GW", "pt_MZ", "pt_PT", "pt_ST", "rn_BI", "ro_MD", "ro_RO", "ru_RU", "rw_RW", "sg_CF", "si_LK", "sk_SK", "sl_SI", "sm_WS", "so_SO", "sq_AL", "sr_CS", "st_LS", "sv_SE", "sw_KE", "sw_TZ", "et_TL", "tg_TJ", "th_TH", "tk_TM", "tl_PH", "to_TO", "tr_TR", "tvl_TV", "uk_UA", "ur_PK", "uz_UZ", "vi_VN", "zh_CN", "zh_HK", "zh_MO", "zh_TW" ]
          },
          "default" : {
            "type" : "boolean"
          }
        }
      },
      "MtbRepositoryDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "name" : {
            "type" : "string"
          },
          "configuration" : {
            "type" : "string",
            "format" : "uuid"
          },
          "owner" : {
            "type" : "string"
          },
          "directory" : {
            "type" : "string"
          },
          "colorScheme" : {
            "type" : "string"
          },
          "template" : {
            "type" : "boolean"
          },
          "templateRepository" : {
            "type" : "string",
            "format" : "uuid"
          },
          "languages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbLiveLanguageDto"
            }
          }
        }
      },
      "MtbGroupSubscriberMemberDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "groupSubscriber" : {
            "$ref" : "#/components/schemas/MtbSubscriberDto"
          },
          "userSubscriber" : {
            "$ref" : "#/components/schemas/MtbSubscriberDto"
          },
          "emailSubscriber" : {
            "$ref" : "#/components/schemas/MtbSubscriberDto"
          }
        }
      },
      "MtbRawTitleDto" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string"
          },
          "translated" : {
            "type" : "boolean"
          },
          "rawTitle" : {
            "type" : "string",
            "nullable" : true
          }
        }
      },
      "MtbSymbolDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "alternativeSymbol" : {
            "type" : "string"
          },
          "prefix" : {
            "type" : "string",
            "nullable" : true
          },
          "prefixLocked" : {
            "type" : "boolean"
          },
          "referenceId" : {
            "type" : "string",
            "nullable" : true
          },
          "objectType" : {
            "type" : "string"
          },
          "owner" : {
            "type" : "string"
          },
          "group" : {
            "type" : "string",
            "description" : "Optional customer-group UUID used as the permission-group selector. If omitted on POST, the `2c8-Permission-Group` header fallback is used. Use the static All Users UUID `8ea77d81-d79c-40f8-8cfc-279fe9e7b2eb` for the default group."
          },
          "ownerRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "ownerWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "groupRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "groupWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "allRead" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : true
          },
          "allWrite" : {
            "type" : "boolean",
            "description" : "Server-controlled permission flag derived from the selected permission group. The backend recalculates this value from the permission-group template.",
            "nullable" : true,
            "example" : false
          },
          "breakdowns" : {
            "type" : "array",
            "description" : "Model UUIDs this symbol breaks down to.\nWhen provided on POST/PATCH, the list replaces all existing breakdowns; send all desired breakdowns.\nUse an empty array to remove all; omit the field to leave unchanged on PATCH (or no breakdowns on POST).\n",
            "example" : [ "cd0c6b2e-6c62-4c45-809c-d43cb4f2b151", "fdc105cf-ab42-49cf-9f48-0a7310a37a9f" ],
            "items" : {
              "type" : "string",
              "description" : "Model UUIDs this symbol breaks down to.\nWhen provided on POST/PATCH, the list replaces all existing breakdowns; send all desired breakdowns.\nUse an empty array to remove all; omit the field to leave unchanged on PATCH (or no breakdowns on POST).\n",
              "example" : "[\"cd0c6b2e-6c62-4c45-809c-d43cb4f2b151\",\"fdc105cf-ab42-49cf-9f48-0a7310a37a9f\"]"
            }
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/MtbRawTitleDto"
            }
          },
          "documents" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/MtbDocumentIdDto"
            }
          }
        }
      },
      "MtbUserImageDto" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid"
          },
          "title" : {
            "type" : "string"
          },
          "content" : {
            "type" : "string"
          }
        }
      },
      "MtbPropertiesDto" : {
        "type" : "object",
        "properties" : {
          "key" : {
            "type" : "string"
          },
          "value" : {
            "type" : "string"
          }
        }
      },
      "MtbLiveAccessControlDto" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64"
          },
          "accessType" : {
            "type" : "string"
          },
          "accessData" : {
            "type" : "string"
          }
        }
      },
      "MtbLiveConfigDto" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64"
          },
          "title" : {
            "type" : "string"
          },
          "profile" : {
            "type" : "integer",
            "format" : "int64"
          },
          "profileTitle" : {
            "type" : "string"
          },
          "repositoryId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "repositoryUUID" : {
            "type" : "string",
            "format" : "uuid"
          },
          "repositoryTitle" : {
            "type" : "string"
          },
          "workspaceId" : {
            "type" : "integer",
            "format" : "int64"
          },
          "workspaceTitle" : {
            "type" : "string"
          },
          "contextRoot" : {
            "type" : "string"
          },
          "modelContext" : {
            "type" : "integer",
            "format" : "int64"
          },
          "modelCount" : {
            "type" : "integer",
            "format" : "int64"
          },
          "accessControl" : {
            "$ref" : "#/components/schemas/MtbLiveAccessControlDto"
          }
        }
      },
      "MtbLiveIndexScope" : {
        "type" : "object",
        "properties" : {
          "languages" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "type" : "string",
              "format" : "uuid"
            }
          },
          "includeModelPrefix" : {
            "type" : "boolean"
          },
          "includeObjectPrefix" : {
            "type" : "boolean"
          },
          "includeDocumentPrefix" : {
            "type" : "boolean"
          },
          "includeModelDocuments" : {
            "type" : "boolean"
          },
          "includeObjectDocuments" : {
            "type" : "boolean"
          },
          "documentUuidsUsedInMenus" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "type" : "string",
              "format" : "uuid"
            }
          },
          "usedListUuids" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "type" : "string",
              "format" : "uuid"
            }
          },
          "usedMatrixKeys" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        }
      },
      "LiveViewExtensionRequest" : {
        "type" : "object",
        "properties" : {
          "provider" : {
            "type" : "string",
            "format" : "uuid"
          },
          "configurationUuid" : {
            "type" : "string",
            "format" : "uuid"
          }
        }
      },
      "MtbLiveSearchDto" : {
        "type" : "object",
        "properties" : {
          "searchQuery" : {
            "type" : "string"
          },
          "language" : {
            "type" : "string",
            "format" : "uuid"
          }
        }
      },
      "MtbLiveContextDto" : {
        "type" : "object",
        "properties" : {
          "models" : {
            "type" : "array",
            "items" : {
              "type" : "integer",
              "format" : "int64"
            }
          }
        }
      },
      "ReportJobAccepted" : {
        "required" : [ "jobUuid" ],
        "type" : "object",
        "properties" : {
          "jobUuid" : {
            "type" : "string",
            "format" : "uuid"
          }
        },
        "additionalProperties" : false
      },
      "ReportJobStatus" : {
        "required" : [ "status" ],
        "type" : "object",
        "properties" : {
          "status" : {
            "type" : "string",
            "enum" : [ "PENDING", "PROCESSING", "SUCCESS", "FAILED" ]
          }
        },
        "additionalProperties" : false
      },
      "ReportDownloadError" : {
        "required" : [ "error" ],
        "type" : "object",
        "properties" : {
          "error" : {
            "type" : "string"
          }
        },
        "additionalProperties" : false
      },
      "RepositoryView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "name" : {
            "type" : "string",
            "nullable" : true
          },
          "status" : {
            "type" : "string",
            "nullable" : true,
            "enum" : [ "ONLINE", "REMOVED", "QUEUED", "CLONING", "FAILED", "DELETED" ]
          },
          "template" : {
            "type" : "boolean",
            "nullable" : true
          },
          "permissions" : {
            "type" : "boolean",
            "nullable" : true
          },
          "draft" : {
            "type" : "boolean",
            "nullable" : true
          },
          "created" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "owner" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "directory" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "colorScheme" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "locked" : {
            "type" : "boolean",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "RepositoryPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/RepositoryView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "AccessorView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "type" : {
            "type" : "string",
            "nullable" : true
          },
          "user" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "group" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "privileges" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "boolean",
              "nullable" : true
            },
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "AccessorPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/AccessorView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "ApiKeyView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "applicationName" : {
            "type" : "string",
            "nullable" : true
          },
          "createdAt" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "expiresAt" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "status" : {
            "type" : "string",
            "nullable" : true,
            "enum" : [ "ACTIVE", "SUSPENDED", "EXPIRED", "REVOKED" ]
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "ApiKeyPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/ApiKeyView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "DirectoryView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "name" : {
            "type" : "string",
            "nullable" : true
          },
          "parent" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "DirectoryPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/DirectoryView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "GroupView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "name" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "GroupPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/GroupView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "UserView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "email" : {
            "type" : "string",
            "nullable" : true
          },
          "firstName" : {
            "type" : "string",
            "nullable" : true
          },
          "lastName" : {
            "type" : "string",
            "nullable" : true
          },
          "administrator" : {
            "type" : "boolean",
            "nullable" : true
          },
          "lastSeen" : {
            "type" : "integer",
            "format" : "int64",
            "nullable" : true
          },
          "disabled" : {
            "type" : "boolean",
            "nullable" : true
          },
          "avatar" : {
            "type" : "string",
            "nullable" : true
          },
          "privileges" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          },
          "repositories" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "properties" : {
                "uuid" : {
                  "type" : "string",
                  "format" : "uuid",
                  "nullable" : true
                }
              },
              "additionalProperties" : false
            }
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "UserPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/UserView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "LanguageView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "defaultLanguage" : {
            "type" : "boolean",
            "nullable" : true
          },
          "name" : {
            "type" : "string",
            "nullable" : true
          },
          "iso" : {
            "type" : "string",
            "nullable" : true
          },
          "hyphenationDictionary" : {
            "type" : "string",
            "nullable" : true
          },
          "icon" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "LanguagePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/LanguageView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "SettingView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "key" : {
            "type" : "string",
            "nullable" : true
          },
          "value" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "SettingPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/SettingView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "TimestampView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "type" : {
            "type" : "string",
            "nullable" : true
          },
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "time" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "TimestampPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/TimestampView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "ImageView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "content" : {
            "type" : "string",
            "format" : "byte",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "ImagePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/ImageView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "PropertyView" : {
        "type" : "object",
        "properties" : {
          "key" : {
            "type" : "string",
            "nullable" : true
          },
          "value" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "PropertyPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/PropertyView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "InstalledPluginView" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "nullable" : true
          },
          "version" : {
            "type" : "string",
            "nullable" : true
          },
          "minApiVersion" : {
            "type" : "string",
            "nullable" : true
          },
          "maxApiVersionExclusive" : {
            "type" : "string",
            "nullable" : true
          },
          "autoUpgrade" : {
            "type" : "boolean",
            "nullable" : true
          },
          "logo" : {
            "type" : "string",
            "nullable" : true
          },
          "targetVersion" : {
            "type" : "string",
            "nullable" : true
          },
          "repositories" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "format" : "uuid",
              "nullable" : true
            }
          },
          "users" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "format" : "uuid",
              "nullable" : true
            }
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "InstalledPluginPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/InstalledPluginView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "Border" : {
        "required" : [ "key", "style" ],
        "type" : "object",
        "properties" : {
          "key" : {
            "type" : "string"
          },
          "style" : {
            "type" : "string"
          }
        }
      },
      "MtbColorSchemeDataDto" : {
        "type" : "object",
        "properties" : {
          "symbol" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/Symbol"
            }
          },
          "border" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/Border"
            }
          },
          "relation-stroke" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/RelationStroke"
            }
          },
          "plugin-friendly" : {
            "type" : "boolean"
          }
        }
      },
      "RelationStroke" : {
        "required" : [ "key", "style" ],
        "type" : "object",
        "properties" : {
          "key" : {
            "type" : "string"
          },
          "style" : {
            "type" : "string"
          }
        }
      },
      "Symbol" : {
        "required" : [ "color", "key", "type" ],
        "type" : "object",
        "properties" : {
          "color" : {
            "type" : "string"
          },
          "key" : {
            "type" : "string"
          },
          "type" : {
            "type" : "string"
          }
        }
      },
      "ColorSchemeView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "default" : {
            "type" : "boolean",
            "nullable" : true
          },
          "content" : {
            "$ref" : "#/components/schemas/MtbColorSchemeDataDto"
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "ColorSchemePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/ColorSchemeView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "AltSymbolType" : {
        "type" : "object",
        "properties" : {
          "objectType" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "altSymbol" : {
            "type" : "string",
            "enum" : [ "or", "and", "man", "woman", "unisex", "figure_full", "figure_torso" ]
          }
        }
      },
      "AltSymbolsType" : {
        "type" : "object",
        "properties" : {
          "altsymbol" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/AltSymbolType"
            }
          }
        }
      },
      "AttachmentType" : {
        "type" : "object",
        "properties" : {
          "sourceType" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "top" : {
            "$ref" : "#/components/schemas/ButtonListType"
          },
          "left" : {
            "$ref" : "#/components/schemas/ButtonListType"
          },
          "bottom" : {
            "$ref" : "#/components/schemas/ButtonListType"
          },
          "right" : {
            "$ref" : "#/components/schemas/ButtonListType"
          }
        }
      },
      "ButtonListType" : {
        "type" : "object",
        "properties" : {
          "button" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ButtonType"
            }
          }
        }
      },
      "ButtonType" : {
        "type" : "object",
        "properties" : {
          "edgeType" : {
            "type" : "string",
            "enum" : [ "flow", "isfollowedby", "consistsof", "isapartof", "isakindof", "isspecializedin", "interrelateswith", "correspondswith", "verificationflow", "secondaryflow", "defines", "adresses", "handles", "isusedby", "controls", "performs", "issituatedat", "canplay", "belongsto", "isempowered", "supports", "requires", "raciresponsible", "raciaccountable", "raciconsulted", "raciinformed", "trigger", "realize" ]
          },
          "outputType" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "reverse" : {
            "type" : "boolean"
          }
        }
      },
      "ColorProfilesType" : {
        "type" : "object",
        "properties" : {
          "createable" : {
            "type" : "boolean"
          },
          "editable" : {
            "type" : "boolean"
          },
          "changeable" : {
            "type" : "boolean"
          }
        }
      },
      "CustomPaperSizeType" : {
        "type" : "object",
        "properties" : {
          "width" : {
            "type" : "number"
          },
          "height" : {
            "type" : "number"
          }
        }
      },
      "DefaultButtonsListType" : {
        "type" : "object",
        "properties" : {
          "attachment" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/AttachmentType"
            }
          }
        }
      },
      "DistanceType" : {
        "type" : "object",
        "properties" : {
          "top" : {
            "type" : "integer",
            "format" : "int32"
          },
          "left" : {
            "type" : "integer",
            "format" : "int32"
          },
          "bottom" : {
            "type" : "integer",
            "format" : "int32"
          },
          "right" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "ExportData" : {
        "type" : "object",
        "properties" : {
          "value" : {
            "type" : "string"
          },
          "name" : {
            "type" : "string"
          },
          "createLanguages" : {
            "type" : "boolean"
          }
        }
      },
      "FontEditingType" : {
        "type" : "object",
        "properties" : {
          "descriptions" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "documents" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "labels" : {
            "$ref" : "#/components/schemas/LabelFontType"
          }
        }
      },
      "FrameSize" : {
        "type" : "object",
        "properties" : {
          "width" : {
            "type" : "integer",
            "format" : "int32"
          },
          "height" : {
            "type" : "integer",
            "format" : "int32"
          },
          "name" : {
            "type" : "string"
          }
        }
      },
      "FrameSizesType" : {
        "type" : "object",
        "properties" : {
          "framesize" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/FrameSize"
            }
          }
        }
      },
      "FromList" : {
        "type" : "object",
        "properties" : {
          "to" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ToList"
            }
          },
          "objecttype" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          }
        }
      },
      "LabelFontType" : {
        "type" : "object",
        "properties" : {
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "editable" : {
            "type" : "boolean"
          },
          "defaultfont" : {
            "type" : "string"
          }
        }
      },
      "Margin" : {
        "type" : "object",
        "properties" : {
          "top" : {
            "type" : "number"
          },
          "bottom" : {
            "type" : "number"
          },
          "left" : {
            "type" : "number"
          },
          "right" : {
            "type" : "number"
          }
        }
      },
      "ModelTypesType" : {
        "type" : "object",
        "properties" : {
          "modeltype" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "GENERAL_MODEL", "INTERESTED_PARTY_MODEL", "REQUIREMENT_MODEL", "PROCESS_MODEL", "PRODUCT_MODEL", "PROJECT_MODEL", "ORGANISATION_MODEL", "SWIMLANE_MODEL", "INFORMATION_MODEL", "CONCEPT_MODEL", "BPMN_MODEL", "APPLICATION_MODEL", "CAPABILITY_MODEL" ]
            }
          },
          "inclusive" : {
            "type" : "boolean"
          }
        }
      },
      "MtbConfigurationTemplateDataDto" : {
        "type" : "object",
        "properties" : {
          "name" : {
            "type" : "string"
          },
          "version" : {
            "type" : "string"
          },
          "uuid" : {
            "type" : "string"
          },
          "permissions" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "language" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "revisions" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "swimlanes" : {
            "$ref" : "#/components/schemas/SwimlanesType"
          },
          "layers" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "lists" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "quickdraw" : {
            "$ref" : "#/components/schemas/QuickDrawType"
          },
          "pattern" : {
            "$ref" : "#/components/schemas/PatternType"
          },
          "alternativeid" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "forcealtidonmodels" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "forcealtidonsymbols" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "editlockedrevisions" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "centerrelations" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "documentresponsible" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "modeltypes" : {
            "$ref" : "#/components/schemas/ModelTypesType"
          },
          "objecttypes" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ObjectTypesType"
            }
          },
          "relationtypes" : {
            "$ref" : "#/components/schemas/RelationTypesType"
          },
          "relationrecommendations" : {
            "$ref" : "#/components/schemas/RelationRecommendationsList"
          },
          "colorprofiles" : {
            "$ref" : "#/components/schemas/ColorProfilesType"
          },
          "fontediting" : {
            "$ref" : "#/components/schemas/FontEditingType"
          },
          "symbolsizes" : {
            "$ref" : "#/components/schemas/SymbolSizesType"
          },
          "framesizes" : {
            "$ref" : "#/components/schemas/FrameSizesType"
          },
          "defaultaltsymbols" : {
            "$ref" : "#/components/schemas/AltSymbolsType"
          },
          "disabledaltsymbols" : {
            "$ref" : "#/components/schemas/AltSymbolsType"
          },
          "gridsize" : {
            "type" : "integer",
            "format" : "int32"
          },
          "forcegrid" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "paperlayouts" : {
            "$ref" : "#/components/schemas/PaperLayoutsType"
          },
          "breakdownsymbols" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "copybreakdownattributes" : {
            "type" : "string",
            "enum" : [ "on", "off" ]
          },
          "exportdata" : {
            "$ref" : "#/components/schemas/ExportData"
          }
        }
      },
      "ObjectTypesType" : {
        "type" : "object",
        "properties" : {
          "objecttype" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
            }
          },
          "inclusive" : {
            "type" : "boolean"
          },
          "modelType" : {
            "type" : "string",
            "enum" : [ "GENERAL_MODEL", "INTERESTED_PARTY_MODEL", "REQUIREMENT_MODEL", "PROCESS_MODEL", "PRODUCT_MODEL", "PROJECT_MODEL", "ORGANISATION_MODEL", "SWIMLANE_MODEL", "INFORMATION_MODEL", "CONCEPT_MODEL", "BPMN_MODEL", "APPLICATION_MODEL", "CAPABILITY_MODEL" ]
          }
        }
      },
      "OverrideButtonsListType" : {
        "type" : "object",
        "properties" : {
          "attachment" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/AttachmentType"
            }
          },
          "modelType" : {
            "type" : "string",
            "enum" : [ "GENERAL_MODEL", "INTERESTED_PARTY_MODEL", "REQUIREMENT_MODEL", "PROCESS_MODEL", "PRODUCT_MODEL", "PROJECT_MODEL", "ORGANISATION_MODEL", "SWIMLANE_MODEL", "INFORMATION_MODEL", "CONCEPT_MODEL", "BPMN_MODEL", "APPLICATION_MODEL", "CAPABILITY_MODEL" ]
          }
        }
      },
      "PaperLayoutType" : {
        "type" : "object",
        "properties" : {
          "name" : {
            "type" : "string"
          },
          "unit" : {
            "type" : "string"
          },
          "margin" : {
            "$ref" : "#/components/schemas/Margin"
          },
          "default" : {
            "type" : "boolean"
          },
          "papersize" : {
            "$ref" : "#/components/schemas/PaperSizeChoice"
          }
        }
      },
      "PaperLayoutsType" : {
        "type" : "object",
        "properties" : {
          "paperlayout" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/PaperLayoutType"
            }
          }
        }
      },
      "PaperSizeChoice" : {
        "type" : "object",
        "properties" : {
          "predefined" : {
            "$ref" : "#/components/schemas/PredefinedPaperSizeType"
          },
          "custom" : {
            "$ref" : "#/components/schemas/CustomPaperSizeType"
          }
        }
      },
      "PatternType" : {
        "type" : "object",
        "properties" : {
          "top" : {
            "type" : "integer",
            "format" : "int32"
          },
          "left" : {
            "type" : "integer",
            "format" : "int32"
          },
          "bottom" : {
            "type" : "integer",
            "format" : "int32"
          },
          "right" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PredefinedPaperSizeType" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "orientation" : {
            "type" : "string",
            "enum" : [ "Portrait", "Landscape" ]
          }
        }
      },
      "QuickDrawType" : {
        "type" : "object",
        "properties" : {
          "enabled" : {
            "type" : "boolean"
          },
          "override" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/OverrideButtonsListType"
            }
          },
          "distance-to-new-symbol" : {
            "$ref" : "#/components/schemas/DistanceType"
          },
          "default" : {
            "$ref" : "#/components/schemas/DefaultButtonsListType"
          }
        }
      },
      "RelationRecommendationsList" : {
        "type" : "object",
        "properties" : {
          "from" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/FromList"
            }
          },
          "forced" : {
            "type" : "boolean"
          }
        }
      },
      "RelationTypeAttribute" : {
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string",
            "enum" : [ "flow", "isfollowedby", "consistsof", "isapartof", "isakindof", "isspecializedin", "interrelateswith", "correspondswith", "verificationflow", "secondaryflow", "defines", "adresses", "handles", "isusedby", "controls", "performs", "issituatedat", "canplay", "belongsto", "isempowered", "supports", "requires", "raciresponsible", "raciaccountable", "raciconsulted", "raciinformed", "trigger", "realize" ]
          }
        }
      },
      "RelationTypesType" : {
        "type" : "object",
        "properties" : {
          "inclusive" : {
            "type" : "boolean"
          },
          "relationtype" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "flow", "isfollowedby", "consistsof", "isapartof", "isakindof", "isspecializedin", "interrelateswith", "correspondswith", "verificationflow", "secondaryflow", "defines", "adresses", "handles", "isusedby", "controls", "performs", "issituatedat", "canplay", "belongsto", "isempowered", "supports", "requires", "raciresponsible", "raciaccountable", "raciconsulted", "raciinformed", "trigger", "realize" ]
            }
          }
        }
      },
      "SwimlaneRelationType" : {
        "type" : "object",
        "properties" : {
          "objectType" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "relationType" : {
            "type" : "string",
            "enum" : [ "flow", "isfollowedby", "consistsof", "isapartof", "isakindof", "isspecializedin", "interrelateswith", "correspondswith", "verificationflow", "secondaryflow", "defines", "adresses", "handles", "isusedby", "controls", "performs", "issituatedat", "canplay", "belongsto", "isempowered", "supports", "requires", "raciresponsible", "raciaccountable", "raciconsulted", "raciinformed", "trigger", "realize" ]
          }
        }
      },
      "SwimlaneType" : {
        "type" : "object",
        "properties" : {
          "swimlaneRelation" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/SwimlaneRelationType"
            }
          },
          "objectType" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          }
        }
      },
      "SwimlanesType" : {
        "type" : "object",
        "properties" : {
          "editable" : {
            "type" : "boolean"
          },
          "swimlane" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/SwimlaneType"
            }
          }
        }
      },
      "SymbolAttributeType" : {
        "type" : "object",
        "properties" : {
          "width" : {
            "type" : "integer",
            "format" : "int32"
          },
          "height" : {
            "type" : "integer",
            "format" : "int32"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "canchange" : {
            "type" : "boolean"
          }
        }
      },
      "SymbolSizesType" : {
        "type" : "object",
        "properties" : {
          "symbol" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/SymbolAttributeType"
            }
          }
        }
      },
      "ToList" : {
        "type" : "object",
        "properties" : {
          "relation" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/RelationTypeAttribute"
            }
          },
          "objectType" : {
            "type" : "string",
            "enum" : [ "ADAPTATION", "ACTIVITY", "APPLICATION", "APPLICATION_COLLABORATION", "APPLICATION_COMPONENT", "APPLICATION_FUNCTION", "APPLICATION_INTERACTION", "APPLICATION_INTERFACE", "APPLICATION_SERVICE", "ARCHIVE", "BPMN_GROUP", "BUSINESS_OBJECT", "CAPABILITY", "CORE_DOCUMENT", "DECISION", "FORUM", "INFO_AREA", "INFO_ENTITY", "INFO_FRAME", "INFO_GROUP", "INDICATOR", "INDIVIDUAL", "INTERESTED_PARTY", "JOIN", "LOCATION", "MESSAGE", "NOTE", "ORGANISATION", "POSSIBILITY", "POSITION", "POSITION_TORSO", "PROBLEM", "PROCESS", "PROJECT", "REQUIREMENT", "RISK", "ROLE", "STRENGTH", "TARGET", "TEXT", "TIME", "TOOL", "WEAKNESS", "WEB_COMPONENT" ]
          },
          "norelation" : {
            "type" : "boolean"
          },
          "default" : {
            "$ref" : "#/components/schemas/RelationTypeAttribute"
          }
        }
      },
      "ConfigurationTemplateView" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64",
            "nullable" : true
          },
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "config" : {
            "$ref" : "#/components/schemas/MtbConfigurationTemplateDataDto"
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "ConfigurationTemplatePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/ConfigurationTemplateView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "RepositoryConfiguration" : {
        "$ref" : "#/components/schemas/MtbConfigurationTemplateDataDto"
      },
      "LocalizedTitle" : {
        "type" : "object",
        "properties" : {
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "rawTitle" : {
            "type" : "string",
            "nullable" : true
          },
          "text" : {
            "type" : "string",
            "nullable" : true
          },
          "translated" : {
            "type" : "boolean",
            "nullable" : true
          },
          "refinement" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false
      },
      "DescriptionTypeView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "dataType" : {
            "type" : "string",
            "nullable" : true
          },
          "inputType" : {
            "type" : "string",
            "nullable" : true
          },
          "icon" : {
            "type" : "string",
            "nullable" : true
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          },
          "connectedTo" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "properties" : {
                "type" : {
                  "type" : "string",
                  "nullable" : true
                },
                "position" : {
                  "type" : "integer",
                  "format" : "int32",
                  "nullable" : true
                },
                "hidden" : {
                  "type" : "string",
                  "nullable" : true
                }
              },
              "additionalProperties" : false
            }
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "DescriptionTypePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/DescriptionTypeView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "DocumentTypeView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "historyEdited" : {
            "type" : "boolean",
            "nullable" : true
          },
          "historyPath" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "DocumentTypePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/DocumentTypeView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "DocumentRootView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "type" : {
            "type" : "string",
            "nullable" : true
          },
          "key" : {
            "type" : "string",
            "nullable" : true
          },
          "value" : {
            "type" : "string",
            "nullable" : true
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "historyEdited" : {
            "type" : "boolean",
            "nullable" : true
          },
          "historyPath" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "DocumentRootPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/DocumentRootView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "LayerTypeView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "zOrder" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "modelType" : {
            "type" : "string",
            "nullable" : true
          },
          "objectTypes" : {
            "type" : "string",
            "nullable" : true
          },
          "ikon" : {
            "type" : "string",
            "nullable" : true
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "LayerTypePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/LayerTypeView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "LayerView" : {
        "type" : "object",
        "properties" : {
          "layerType" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "LayerPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/LayerView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "ModelView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "modelType" : {
            "type" : "string",
            "nullable" : true
          },
          "alternativeId" : {
            "type" : "string",
            "nullable" : true
          },
          "workflowState" : {
            "type" : "string",
            "nullable" : true
          },
          "parentVersion" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "version" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "versionLocked" : {
            "type" : "boolean",
            "nullable" : true
          },
          "prefix" : {
            "type" : "string",
            "nullable" : true
          },
          "locked" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "lockedBy" : {
            "type" : "string",
            "nullable" : true
          },
          "created" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          },
          "documents" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "properties" : {
                "sourceId" : {
                  "type" : "string",
                  "nullable" : true
                },
                "uuid" : {
                  "type" : "string",
                  "nullable" : true
                }
              },
              "additionalProperties" : false
            }
          },
          "historyPath" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          },
          "prefixLocked" : {
            "type" : "boolean",
            "nullable" : true
          },
          "ownerRead" : {
            "type" : "boolean",
            "nullable" : true
          },
          "ownerWrite" : {
            "type" : "boolean",
            "nullable" : true
          },
          "groupRead" : {
            "type" : "boolean",
            "nullable" : true
          },
          "groupWrite" : {
            "type" : "boolean",
            "nullable" : true
          },
          "allRead" : {
            "type" : "boolean",
            "nullable" : true
          },
          "allWrite" : {
            "type" : "boolean",
            "nullable" : true
          },
          "notify" : {
            "type" : "boolean",
            "nullable" : true
          },
          "historyEdited" : {
            "type" : "boolean",
            "nullable" : true
          },
          "owner" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "group" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "createdBy" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "lastModifiedBy" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "ModelPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/ModelView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "SymbolView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "alternativeSymbol" : {
            "type" : "string",
            "nullable" : true
          },
          "parentVersion" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "version" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "versionLocked" : {
            "type" : "boolean",
            "nullable" : true
          },
          "prefix" : {
            "type" : "string",
            "nullable" : true
          },
          "prefixLocked" : {
            "type" : "boolean",
            "nullable" : true
          },
          "referenceId" : {
            "type" : "string",
            "nullable" : true
          },
          "historyEdited" : {
            "type" : "boolean",
            "nullable" : true
          },
          "objectType" : {
            "type" : "string",
            "nullable" : true
          },
          "lockedBy" : {
            "type" : "string",
            "nullable" : true
          },
          "ownerRead" : {
            "type" : "boolean",
            "nullable" : true
          },
          "ownerWrite" : {
            "type" : "boolean",
            "nullable" : true
          },
          "groupRead" : {
            "type" : "boolean",
            "nullable" : true
          },
          "groupWrite" : {
            "type" : "boolean",
            "nullable" : true
          },
          "allRead" : {
            "type" : "boolean",
            "nullable" : true
          },
          "allWrite" : {
            "type" : "boolean",
            "nullable" : true
          },
          "locked" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "created" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          },
          "historyPath" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          },
          "breakdowns" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "format" : "uuid",
              "nullable" : true
            }
          },
          "documents" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "properties" : {
                "source" : {
                  "type" : "string",
                  "nullable" : true
                },
                "id" : {
                  "type" : "string",
                  "nullable" : true
                }
              },
              "additionalProperties" : false
            }
          },
          "owner" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "group" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "createdBy" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "lastModifiedBy" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "SymbolPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/SymbolView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "BreakdownView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "symbol" : {
            "type" : "object",
            "properties" : {
              "uuid" : {
                "type" : "string",
                "format" : "uuid",
                "nullable" : true
              },
              "version" : {
                "type" : "integer",
                "format" : "int32",
                "nullable" : true
              }
            },
            "additionalProperties" : false
          },
          "edge" : {
            "type" : "object",
            "properties" : {
              "uuid" : {
                "type" : "string",
                "format" : "uuid",
                "nullable" : true
              },
              "model" : {
                "type" : "object",
                "properties" : {
                  "uuid" : {
                    "type" : "string",
                    "format" : "uuid",
                    "nullable" : true
                  },
                  "version" : {
                    "type" : "integer",
                    "format" : "int32",
                    "nullable" : true
                  }
                },
                "additionalProperties" : false
              }
            },
            "additionalProperties" : false
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "BreakdownPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/BreakdownView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "VersionLogItem" : {
        "type" : "object",
        "properties" : {
          "message" : {
            "type" : "string",
            "nullable" : true
          },
          "reason" : {
            "type" : "string",
            "nullable" : true,
            "enum" : [ "LOCKED_SYMBOL_BY_USER", "LOCKED_MODEL_BY_USER", "LOCKED_SYMBOL_IN_MODEL", "NEW_SYMBOL_BY_USER", "NEW_MODEL_BY_USER", "NEW_MODEL_CONTAINS_SYMBOL", "NEW_MODEL_SYMBOL_RENAMED", "CHANGES_IN_REVISION" ]
          },
          "workflowState" : {
            "type" : "string",
            "nullable" : true
          },
          "newVersion" : {
            "type" : "boolean",
            "nullable" : true
          },
          "user" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "version" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "trigger" : {
            "type" : "object",
            "properties" : {
              "type" : {
                "type" : "string",
                "nullable" : true
              },
              "uuid" : {
                "type" : "string",
                "format" : "uuid",
                "nullable" : true
              },
              "version" : {
                "type" : "integer",
                "format" : "int32",
                "nullable" : true
              }
            },
            "additionalProperties" : false
          }
        },
        "additionalProperties" : false
      },
      "VersionView" : {
        "type" : "object",
        "properties" : {
          "version" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "logItems" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/VersionLogItem"
            }
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "VersionPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/VersionView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "PluginDataView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "plugin" : {
            "type" : "string",
            "nullable" : true
          },
          "key" : {
            "type" : "string",
            "nullable" : true
          },
          "root" : {
            "type" : "boolean",
            "nullable" : true
          },
          "relations" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "additionalProperties" : {
                "type" : "array",
                "nullable" : true,
                "items" : {
                  "type" : "object",
                  "properties" : {
                    "uuid" : {
                      "type" : "string",
                      "nullable" : true
                    },
                    "strong" : {
                      "type" : "boolean",
                      "nullable" : true
                    },
                    "position" : {
                      "type" : "integer",
                      "format" : "int32",
                      "nullable" : true
                    }
                  },
                  "additionalProperties" : false
                }
              },
              "nullable" : true
            }
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "PluginDataPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/PluginDataView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "AttachedPluginDataView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "plugin" : {
            "type" : "string",
            "nullable" : true
          },
          "key" : {
            "type" : "string",
            "nullable" : true
          },
          "root" : {
            "type" : "boolean",
            "nullable" : true
          },
          "textContent" : {
            "type" : "string",
            "nullable" : true
          },
          "relations" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "additionalProperties" : {
                "type" : "array",
                "nullable" : true,
                "items" : {
                  "type" : "object",
                  "properties" : {
                    "uuid" : {
                      "type" : "string",
                      "nullable" : true
                    },
                    "strong" : {
                      "type" : "boolean",
                      "nullable" : true
                    },
                    "position" : {
                      "type" : "integer",
                      "format" : "int32",
                      "nullable" : true
                    }
                  },
                  "additionalProperties" : false
                }
              },
              "nullable" : true
            }
          },
          "content" : {
            "type" : "string",
            "format" : "byte",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "AttachedPluginDataPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/AttachedPluginDataView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "PublicationView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "baseUrl" : {
            "type" : "string",
            "nullable" : true
          },
          "profileId" : {
            "type" : "string",
            "nullable" : true
          },
          "publishDate" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "notifications" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "properties" : {
                "revision" : {
                  "type" : "integer",
                  "format" : "int32",
                  "nullable" : true
                },
                "model" : {
                  "type" : "string",
                  "nullable" : true
                }
              },
              "additionalProperties" : false
            }
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "PublicationPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/PublicationView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "PublishProfileView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "description" : {
            "type" : "string",
            "nullable" : true
          },
          "type" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "PublishProfilePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/PublishProfileView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "PublishTemplateView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "type" : {
            "type" : "string",
            "nullable" : true
          },
          "default" : {
            "type" : "boolean",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "PublishTemplatePage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/PublishTemplateView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "CustomRelationView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "actionObject" : {
            "type" : "string",
            "nullable" : true
          },
          "uiGenerated" : {
            "type" : "boolean",
            "nullable" : true
          },
          "lastModified" : {
            "type" : "string",
            "format" : "date-time",
            "nullable" : true
          },
          "historyEdited" : {
            "type" : "boolean",
            "nullable" : true
          },
          "script" : {
            "type" : "string",
            "nullable" : true
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          },
          "columns" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          },
          "historyPath" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "CustomRelationPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/CustomRelationView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "ModelSubscriberView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "type" : {
            "type" : "string",
            "nullable" : true
          },
          "email" : {
            "type" : "string",
            "nullable" : true
          },
          "userId" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "name" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "ModelSubscriberPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/ModelSubscriberView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "VertexView" : {
        "type" : "object",
        "properties" : {
          "uuid" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "x" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "y" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "width" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "height" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "sizeRatio" : {
            "type" : "number",
            "nullable" : true
          },
          "lockProportions" : {
            "type" : "boolean",
            "nullable" : true
          },
          "zOrder" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "centerLabel" : {
            "type" : "boolean",
            "nullable" : true
          },
          "labelTextFont" : {
            "type" : "string",
            "nullable" : true
          },
          "labelTextSize" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "labelTextStyle" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "labelTextColor" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "manualLabelColor" : {
            "type" : "boolean",
            "nullable" : true
          },
          "lockLabel" : {
            "type" : "boolean",
            "nullable" : true
          },
          "showLabel" : {
            "type" : "boolean",
            "nullable" : true
          },
          "transformRGB" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "transformBr" : {
            "type" : "number",
            "nullable" : true
          },
          "transformHue" : {
            "type" : "number",
            "nullable" : true
          },
          "transformSat" : {
            "type" : "number",
            "nullable" : true
          },
          "locked" : {
            "type" : "boolean",
            "nullable" : true
          },
          "elidable" : {
            "type" : "boolean",
            "nullable" : true
          },
          "breakDownSymbol" : {
            "type" : "boolean",
            "nullable" : true
          },
          "historyEdited" : {
            "type" : "boolean",
            "nullable" : true
          },
          "owningDataObject" : {
            "type" : "boolean",
            "nullable" : true
          },
          "symbol" : {
            "type" : "object",
            "properties" : {
              "uuid" : {
                "type" : "string",
                "format" : "uuid",
                "nullable" : true
              },
              "version" : {
                "type" : "integer",
                "format" : "int32",
                "nullable" : true
              }
            },
            "additionalProperties" : false
          },
          "titles" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/LocalizedTitle"
            },
            "nullable" : true
          },
          "image" : {
            "type" : "string",
            "nullable" : true
          },
          "labelBounds" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "object",
              "properties" : {
                "x" : {
                  "type" : "integer",
                  "format" : "int32",
                  "nullable" : true
                },
                "y" : {
                  "type" : "integer",
                  "format" : "int32",
                  "nullable" : true
                },
                "width" : {
                  "type" : "integer",
                  "format" : "int32",
                  "nullable" : true
                },
                "height" : {
                  "type" : "integer",
                  "format" : "int32",
                  "nullable" : true
                }
              },
              "additionalProperties" : false
            },
            "nullable" : true
          },
          "inputs" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "format" : "uuid",
              "nullable" : true
            }
          },
          "outputs" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "format" : "uuid",
              "nullable" : true
            }
          },
          "layer" : {
            "type" : "string",
            "format" : "uuid",
            "nullable" : true
          },
          "historyPath" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "string",
              "nullable" : true
            }
          },
          "border" : {
            "anyOf" : [ {
              "type" : "string",
              "nullable" : true
            }, {
              "maxItems" : 0,
              "type" : "array",
              "nullable" : true,
              "items" : {
                "type" : "string",
                "nullable" : true
              }
            } ]
          }
        },
        "additionalProperties" : false,
        "description" : "Selectable response fields. Projection and field selection may omit properties; nullable values depend on the stored data. This is a read model, not a write DTO."
      },
      "VertexPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/VertexView"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "ResolvedDocument" : {
        "type" : "object",
        "properties" : {
          "documentId" : {
            "type" : "object",
            "properties" : {
              "source" : {
                "type" : "string",
                "nullable" : true
              },
              "id" : {
                "type" : "string",
                "nullable" : true
              }
            },
            "additionalProperties" : false
          },
          "link" : {
            "type" : "string",
            "nullable" : true
          },
          "title" : {
            "type" : "string",
            "nullable" : true
          },
          "iconURL" : {
            "type" : "string",
            "nullable" : true
          },
          "metadata" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "type" : "object",
              "properties" : {
                "columnType" : {
                  "type" : "string",
                  "nullable" : true
                },
                "id" : {
                  "type" : "string",
                  "nullable" : true
                },
                "data" : {
                  "type" : "string",
                  "nullable" : true
                }
              },
              "additionalProperties" : false
            }
          }
        },
        "additionalProperties" : false
      },
      "DocumentSources" : {
        "type" : "array",
        "nullable" : true,
        "items" : {
          "type" : "string",
          "nullable" : true
        }
      },
      "DocumentKeys" : {
        "type" : "array",
        "nullable" : true,
        "items" : {
          "type" : "string",
          "nullable" : true
        }
      },
      "ResolvedDocuments" : {
        "type" : "array",
        "nullable" : true,
        "items" : {
          "$ref" : "#/components/schemas/ResolvedDocument"
        }
      },
      "VersionsResponse" : {
        "type" : "object",
        "properties" : {
          "mtBackendVersion" : {
            "type" : "string",
            "nullable" : true
          },
          "dbVersion" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false
      },
      "MtbDescriptionDtoPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbDescriptionDto"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "MtbModelContextDtoPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbModelContextDto"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "MtbListDtoPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbListDto"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "MtbMatrixDtoPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbMatrixDto"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "MtbPluginRelationDtoPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbPluginRelationDto"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "MtbSubscriberDtoPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbSubscriberDto"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "MtbPermissionGroupDtoPage" : {
        "type" : "object",
        "properties" : {
          "startAt" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "maxResults" : {
            "type" : "integer",
            "format" : "int32",
            "nullable" : true
          },
          "total" : {
            "type" : "integer",
            "format" : "int64"
          },
          "data" : {
            "type" : "array",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/MtbPermissionGroupDto"
            }
          },
          "sortColumns" : {
            "type" : "string",
            "nullable" : true
          },
          "availableExpansions" : {
            "type" : "string",
            "nullable" : true
          },
          "expanded" : {
            "type" : "string",
            "nullable" : true
          }
        },
        "additionalProperties" : false,
        "description" : "Paginated response. data contains the selected item fields. Optional metadata is endpoint-specific."
      },
      "RateLimitErrorResponse" : {
        "required" : [ "error", "message", "retryAfterSeconds" ],
        "type" : "object",
        "properties" : {
          "error" : {
            "type" : "string",
            "description" : "Rate-limit error label.",
            "enum" : [ "Rate limit exceeded" ]
          },
          "message" : {
            "type" : "string",
            "description" : "Configured request limit, formatted as Maximum N requests."
          },
          "retryAfterSeconds" : {
            "minimum" : 0,
            "type" : "integer",
            "description" : "Seconds to wait; matches Retry-After.",
            "format" : "int64"
          }
        },
        "description" : "Body emitted by the backend rate-limit request filter, distinct from common API errors."
      }
    },
    "headers" : {
      "X-RateLimit-Limit" : {
        "description" : "Present only when this request is subject to rate limiting. Maximum requests per configured period; no universal quota is published.",
        "schema" : {
          "minimum" : 0,
          "type" : "integer",
          "format" : "int32"
        }
      },
      "X-RateLimit-Remaining" : {
        "description" : "Present only when this request is subject to rate limiting. Reported requests remaining in the current period.",
        "schema" : {
          "minimum" : 0,
          "type" : "integer",
          "format" : "int32"
        }
      },
      "X-RateLimit-Reset" : {
        "description" : "Present only when this request is subject to rate limiting. Reported reset time as Unix epoch seconds, not a duration.",
        "schema" : {
          "minimum" : 0,
          "type" : "integer",
          "format" : "int64"
        }
      },
      "Retry-After" : {
        "description" : "On a backend 429, seconds to wait before retrying. Matches retryAfterSeconds in the body; this filter emits a duration, not an HTTP date.",
        "schema" : {
          "minimum" : 0,
          "type" : "integer",
          "format" : "int64"
        }
      }
    },
    "securitySchemes" : {
      "apiKeyAuth" : {
        "type" : "apiKey",
        "description" : "Provide your API key in the x-api-key header.",
        "name" : "x-api-key",
        "in" : "header"
      }
    }
  },
  "x-2c8-build" : {
    "version" : "2026.1-u1-b7-SNAPSHOT",
    "commit" : "549d51014b3a9fe42a307cb73ea2bb0ab152ee6d"
  }
}